Promise 通常被定义为最终会变为可用值的代理,是一种处理异步代码的方式。
运作方式
当promise
被调用后,它会以处理中状态开始。 这意味着调用的函数会继续执行,而promise
仍处于处理中直到解决为止,从而为调用的函数提供所请求的任何数据。
被创建的promise
最终会以被解决状态或被拒绝状态结束,并在完成时调用相应的回调函数(传给 then
和 catch
)。
可以把promise
简单理解成一个容器,存放着某个未来才会结束的事件的结果(通常是一个异步操作)。通过promise
对象来获取异步操作消息,处理各种异步操作。
特点
对象的状态不受外界影响,只与异步操作的结果有关。
Promise
对象代表一个异步操作,有三种状态:**pending**
(进行中)、**fulfilled**
(已成功)和**rejected**
(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise
这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。一旦状态改变,就不会再变,任何时候都可以得到这个结果。
Promise
对象的状态改变,只有两种可能:从**pending**
变为**fulfilled**
和从**pending**
变为**rejected**
。只要这两种情况发生,状态就不会再变了,会一直保持这个结果,这时就称为**resolved**
(已定型)。如果改变已经发生了,再对**Promise**
对象添加回调函数,也会立即得到这个结果。这与事件(Event
)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
基本使用
Promise
为一个构造函数,需要用new
来实例化。
let p = new Promise((resolve, reject) => {
if(/*异步操作成功*/){
resolve(value);
} else {
reject(error);
}
})
resolve
作用是将Promise
的状态从pending
变成resolved
,在异步操作成功时调用,返回异步操作的结果,作为参数传递出去。reject
作用是将Promise
的状态从pending
变成rejected
,在异步操作失败时报错,作为参数传递出去。- 如果在执行路径中从未调用过这些函数之一,则
promise
会保持pending
状态。
Promise
实例生成以后,可以用.then()
方法将参数中的函数添加到当前 Promise 的正常执行序列,分别指定resolved
状态和rejected
状态的回调函数。
p.then(function(val){
// success...
},function(err){
// error...
})
resolve()
中可以放置一个参数用于向下一个then
传递一个值,then
中的函数也可以返回一个值传递给 then
。
new Promise(function (resolve, reject) {
console.log(1111);
resolve(2222);
}).then(function (value) {
console.log(value);
return 3333;
}).then(function (value) {
console.log(value);
throw "An error";
}).catch(function (err) {
console.log(err);
});
// 1111
// 2222
// 3333
// An error
如果then
中返回的是一个Promise
对象,那么下一个then
将相当于对这个返回的Promise
进行操作。
简单辨析
不使用promise,令ajax同步(async: false),阻塞了下面:
使用promise,异步。
参考: https://www.bilibili.com/video/BV1ch411k7Ud https://www.runoob.com/js/js-promise.html http://js.pingan8787.com/