学习Promise
Promise的含义
Promise
是一个对象,从它可以获取异步操作的消息。简单来说,Promise
像一个容器,其中保存着异步操作的结果。
特点
-
Promise
对象代表一个异步操作,有三种状态:
pending
(进行中)
fulfilled
(已成功)
rejected
(已失败)
对象的状态是由异步操作的结果来决定的,与外界无关。 -
Promise对象的状态改变只有两种可能:从
pending
变为fulfilled
和从pending
变为rejected
。且不会再变了。resolved一般用来指代fulfillied
。
基本用法
Promise
是一个构造函数,用来生成Promise
实例。
const promise = new Promise(function(resolve,reject){
if(/* 异步操作成功 */){
resolve(value);
}else{
reject(error);
}
})
在Promise
实例生成以后,可以用then
方法分别指定resolved
状态和rejected
状态的回调函数。
promise.then(function(value){
// success
},function(error){
//failure
});
注:第二个值可选。
Promise
新建后就会立即执行。
let promise = new Promise(function(resolve,reject){
console.log('Promise');
resolve();
});
pomise.then(function(){
console.log('resolved');
})
console,log('Hi!');
//Promise
//Hi
//resolved
执行顺序:Promise
新建即执行=>同步任务=>then
方法指定的回调函数
resolve
函数和reject
函数都可以带有参数,reject
函数的参数一般是Error
对象的实例,表示抛出的错误;resolve
函数的参数除了正常值外,还有可能是另一个Promise
实例。
注:一般来说,Promise
的使命就是调用resolve
和reject
。故一般其它操作可以放在then
里去执行。
then、catch和finally
then
方法为Promise
实例添加状态改变时的回调函数,第一个参数是resolved
状态的回调函数,第二个参数(可选)是rejected
状态的回调函数。
由于then
方法返回的是一个新的Promsie
实例,即可以采用链式写法,then
方法后面再调用另一个then
方法。
catch
方法是用于指定错误发生时的回调函数。Promise
对象的错误具有“冒泡”性质,前面任何一个Promise
对象抛出错误,最后都会被catch
捕获。
注:Promise内部的错误不会影响外部代码的运行。
finally
方法用于指定不管Promise
对象最后的状态如何,都会执行的操作。其回调函数不接受任何参数。
Promise.all()
const p = Promise.all([p1,p2,p3]);
Promise.all()
方法接受一个数组作为参数,p1
、p2
、p3
都是Promise
的实例(如果不是,也要转为Promise
实例)。其中p1
、p2
、p3
只有全部是fulfilled
,p
的状态才会是fulfilled
,否则p的状态就是rejected
。
文章来源:
阮一峰ES6入门.