promise是异步编程的一种解决方案,简单说是一个容器,封装着一个未来才会发生的事件。Promise是一个对象,可以获取异步操作的消息。
Promise对象特点:
- 对象的状态不受外界影响,Promise对象代表一个异步操作,他有三种状态:pending(进行中),fulfilled(已成功),和rejected(已失败)。只有异步操作的结果才能决定当前是哪一种状态。
- Promise的状态一旦确定就不会再改变,其返回的状态只有成功和失败两种可能。Promise的状态一旦确定,再对Promise添加回调函数会立即得到相应的结果,与事件不同的是,事件的结果一旦错过,再去监听是得不到结果的。
基本使用
Promise构造函数接受一个函数作为参数,该函数两个参数分别是resolve和reject,这两个参数是函数,由javascript引擎提供。
const promise = new Promise(function(resolve,reject){
// do
if(true){
resolve(res);
}else{
reject(err);
}
});
resolve函数将Promise的状态由“未完成”改为“成功”,reject将Promise状态由“未完成”改为“失败”。
接收Promise返回状态:Promise.prototype.then()
const promise = new Promise(function(resolve,reject){
// do
if(true){
resolve(res);
}else{
reject(err);
}
});
promise.then(function(res){},function(err){}); //第一种方式
promise.then(function(res){}).catch(function(err{})); //第二种方式
这里第一种方式then的第一个参数为接收成功状态的函数,其参数为成功状态的返回对象,第二个参数为接收失败状态的函数,其参数为失败状态的返回对象;此时后面使用catch可以捕捉应用程序的错误。
第二种方式then中只有一个接收成功状态的函数,后面使用catch来接收失败的返回结果,程序异常也由catch捕捉。但是第二种方式可以捕捉到then中成功状态代码执行的错误,所以建议使用第二种方式。
finally
finally方法指定一段代码,不管Promise最后状态是什么,这段代码都会执行。
promise.then(res=>{...})
.catch(err=>{...})
.finally(()=>{...});
Promise.all()
const p = Promise.all([p1,p2,p3]) //p1,p2,p3都是Promise实例
p的状态由p1、p2、p3决定,分成两种情况。
(1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
(2)只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
Promise.race()
const p = Promise.race([p1,p2,p3]) //p1,p2,p3都是Promise实例
上面代码中,只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。