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状态时,无法得知目前进展到那个阶段。
领取专属 10元无门槛券
私享最新 技术干货