超实用!关于ES6的Promise对象和用法

ES6:Promise

概念:

promise,就是一个对象,用来传递异步操作的消息。它代表了某个未来才会知道结果的事件(通常是异步操作),并且这个事件提供统一的api,可供进一步处理。

2个特点:

1、对象的状态不受外界影响:只有异步操作的结果可以决定promise的状态。

3种状态:Pending(进行中)、Resolved(已完成)、Rejected(已失败)

2、一旦状态改变就不会再变了

状态只能从Pending到Resolved或者Pending到Rejected,一旦状态改变,就会一直保持那个状态,就算你再添加回调函数,也会立即返回那个改变的状态值。

使用:

Promise对象是个构造函数,用来生成Promise实例:

var promise = new Promise(function(resolve,reject){

//...一些异步操作

if(/*异步操作成功*/){

resolve(value);//将状态从Pending->Resolved(未完成->成功),并将异步操作的数据传递出去

}else{

reject(error);//将状态从Pending->Rejected(未完成->失败),并将错误信息传递出去

}

});

//监听promise的状态变化

promise.then(function(value){

//成功

},function(error){

//失败

});

方法:

1、Promise.prototype.then()

语法:then(fn1,fn2);

参数:fn1->是对Resolved状态的回调函数,fn2->是对Rejected状态的回调函数。

说明:then返回的是一个新的Promise实例,不是原来的那个了,所以可以采用链式的写法,指定一组按照顺序调用的回调函数,解决异步IO中深层嵌套的麻烦。

then的2种返回值情况:then的返回值不是Promise对象,即then里面没有进行异步操作,那么前一个then回调函数完成后,会将返回结果作为参数传给下一个then的回调函数,返回的是一个Promise对象,即有异步操作,那后一个then将会等待改Promise对象的状态发生改变后再被调用。

2、Promise.prototype.catch()

catch()是then(null,rejection)的别名,用与指定发生错误时的回调函数

用法: .then().then().then().catch();

解释:如果异步操作抛出异常,状态就会便会Rejected,此时就会调用catch方法

注意:Promise对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获位置,所以,错误总会被下一个catch语句捕获,所以一般来说,不要在then方法里定义Rejected状态的回调函数(即第二个参数),而是应该在最后使用catch方法。

3、Promise.prototype.done()

问题:then或者catch,不管用哪一个作为回调链的结尾,要是最后一个方法抛出错误,都没办法捕捉。为了解决此问题,提供了done方法,总是处于回调链尾端,保证抛出的任何错误都会被捕捉到,并向全局抛出。

语法: .then().then().then().catch().then().done();

4、Promise.prototype.finally()

不管Promise对象最后的状态如何,都会执行finally方法,它接受一个普通的回调函数作为参数。

5、Promise.all()

作用:将多个Promise实例包装成一个新的Promise实例。

语法:

var promise = Promise.all([promise1,promise2,promise3]);

promise .then().catch()

注意:如果数组中有的不是Promise对象的实例,那么便会调用Promise.resolve方法,将其转为Promise的实例。不一定必须是数组,但必须具有Itetator接口。只有数组内的Promise都Resolved,promise的状态才会变为Resolved;只要有一个是Rejected状态,promise的状态就是Rejected。

6、Promise.race()

作用:与Promise.all()类似,将多个Promise实例包装成一个新的Promise实例,只是返回的状态由数组内最先发生改变的Promise实例决定。

语法:

var promise = Promise.rece([promise1,promise2,promise3]);

promise .then().catch();

注意:只要数组中的promise实例有一个率先改变状态,那么promise 的状态就会跟着改变,那个率先改变的Promise实例的返回值,就传递给promise的回调函数。

7、Promise.resolve()

作用:将现有对象转为Promise对象

语法:

Promise.resolve("foo") new Promise(function(resolve))

例如:

var p = Promise.resolve("hello");

p.then(function(s){

console.log(s)//hello

})

注:

1、如果Promise.resolve()的参数不是具有then方法的对象,则返回新的Promise对戏那个,且状态为Resolved。

2、如果参数是一个Promise实例,则原封不动的返回。

8、reject()

返回一个Promise实例,状态为Rejected;

var p = Promise.reject("出错了");

p.then(null,function(s){

console.log(s)//出错了

})

优点:有了Promise对象,就可以异步操作用同步操作的流程表达出来,避免了层层嵌套的回调函数。

缺点:

1、无法取消Promise,一旦新建,就会立即执行,无法中途取消。

2、如果不设置回调函数,Promise内部抛出的错误就不会反应到外部。

3、在处于Pending状态时,无法得知目前进展到那个阶段。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180608A1FTRF00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券