Promise

时间:2019-03-25
本文章向大家介绍Promise,主要包括Promise使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

promise是异步编程的一种解决方案,简单说是一个容器,封装着一个未来才会发生的事件。Promise是一个对象,可以获取异步操作的消息。

Promise对象特点:

  1. 对象的状态不受外界影响,Promise对象代表一个异步操作,他有三种状态:pending(进行中),fulfilled(已成功),和rejected(已失败)。只有异步操作的结果才能决定当前是哪一种状态。
  2. 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([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([p1,p2,p3]) //p1,p2,p3都是Promise实例

上面代码中,只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。