概念
- promise就是一个容器,里面保存着未来才会结束的事件的结果。(通常为异步操作的结果)
- promise是一个对象,可以获取异步操作的消息。
- promise对象是一个构造函数,用来生成promise实例。
特点
- promise对象的状态不受外界影响。三种状态: pending(进行中),fulfilled(已成功),rejected(已失败)。只有异步操作的结果能决定当前状态。其他操作都无法改变状态。
- 一旦状态改变,就不会再变,任何时候都可以得到这个结果。promise状态的改变只有两种可能:从进行中变成已成功;从进行中变成已失败。 变完就会保持结果,称为resolved(已定型)。 改变发生之后再对promise对象添加回调函数,也能立即得到这个结果。(而事件(Event),如果你错过它,再去监听,是得不到结果的。)
优点
- promise对象将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数(回调地狱)
- promise对象提供统一的api,使控制异步操作更加容易。
缺点
- 无法取消promise。一旦新建它就立即执行,无法中途取消。
- 如果不设置回调函数,promise内部抛出的错误,不会反应到外部。
- 当处于进行状态,不知道是进行到那一状态(刚开始还是即将完成)
基本用法
const promise = new Promise((resolve, reject) => {
if (/*异步操作成功*/) {
resolve(value)
} else {
reject(error)
}
})
- promise构造函数,接收一个函数作为参数。
- 该函数的两个参数resolve和reject是两个函数,由JavaScript引擎提供,不用自己部署。
- resolve 函数的作用是,将Promise 对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
- reject 函数的作用是,将Promise 对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
- Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。
Promise.then(function(value) {
// success
}, function(error) {
// failure
})
then方法可以接受两个回调函数作为参数。第一个回调函数是Promise 对象的状态变为resolved时调用,第二个回调函数是Promise 对象的状态变为rejected时调用。其中,第二个函数是可选的,不一定要提供。这两个函数都接受Promise 对象传出的值作为参数。