ES6之promise的理解

利用promise可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,promise对象提供统一的接口,使得控制异步操作更加容易。

它是ES6的一个内置对象,实际上是一个构造函数。

1.介绍

1)promise有三个状态:Pending-promise的初始状态,等到任务完成或是被拒绝;Resolved-执行完成并且成功的状态Rejected-执行完成并且失败的状态。此三个状态不能相互逆转。

               只有异步操作的结果可以决定当前是哪一种状态,任何其他操作都不能改变这个状态。最终就两种状态,要么成功,要么失败被拒绝。。

2)promise对象必须实现then方法,可以说then是promise的核心,而且then方法必须返回一个promise对象,同一个promise对象可以注册多个then方法,并且回调的执行顺序和他们注册的顺序一致。

               then()第一个参数接收resolved()传来的数据,catch()第一个参数接收rejected()传来的数据

3)then 方法可以接受两个回调函数作为参数。第一个回调函数是Promise对象的状态变为 resolved时调用,第二个回调函数是 Promise对象的状态变为rejected时调用。其中,第二个函数是可选的,不一定要提供。这两个函数都接受 Promise 对象传出的值作为参数。

2.使用

我们可以用 promise.then()promise.catch() 和 promise.finally()这些方法将进一步的操作与一个变为已敲定状态的 promise 关联起来。例如:

var promise = new Promise(function (resolve, reject) {
    if(异步执行成功) {
    resolve(value);
  } else {
    reject(error);
  }
});
promise.then(function(value){   console.log('回调执行成功之后的操作', value); }, function() {   console.log('回调执行失败之后的操作'); });

其中,value值表示的是异步执行成功之后在promise函数中获取的值,不确切的说就是可以获取该函数的私有变量,将promise的值获取过来之后在then中可以实现值的相应应用。

 3.拓展

 (1) promise.all()方法

用法:const p = promise.all([p1, p2, .........])
Promise.all 里面参数为一个数组,p1 、 p2 、 p3 都是 Promise 实例,另外, Promise.all() 方法的参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例。
1)只有 p1 、 p2 、 p3 的状态都变成 fulfilled , p 的状态才会变成 fulfilled ,此时 p1 、 p2 、 p3 的返回值组成一个数组,传递给 p 的回调函数。
2)只要 p1 、 p2 、 p3 之中有一个被 rejected , p 的状态就变成 rejected ,此时第一个被 reject 的实例的返回值,会传递给 p 的回调函数。

 
Promise.all([p1, p2, p3]).then(() => {
    allList.filter(item => (selectList.indexOf(item.key) !== -1)).forEach(elem => elem.direction = 'right');
    this.prjList = allList;
    this.prjList.forEach(item => {
        if (this.automationData.hasOwnProperty('ownPrj')) {
            if (item.key === this.automationData.ownPrj) {
                item.disabled = true;
            }
        }
    });
});
  • then 的第一个参数是所有promise都成功的调用,返回结果是一个数组,数组的每一项为函数promise 的返回结果,

  • then 的第二个参数:返回结果有一个失败则执行失败的回调,拿到的是第一个失败的值。

(2)Promise.race()

Promise.race() 方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。

 用法:
const p = Promise.race([p1, p2, p3]);

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

Promise.race() 方法的参数与 Promise.all() 方法一样,如果不是 Promise 实例,就会先调用下面讲到的 Promise.resolve() 方法,将参数转为 Promise 实例,再进一步处理。

总结:

        .all()和.race(),入参都是一个promise数组,all是所有的都成功返回成功的数组,有一个失败即返回失败的状态。

        .race()是返回最先完成的状态。

(3)Promise.allSettled()

Promise.allSettled() 方法接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例。只有等到所有这些参数实例都返回结果,不管是 fulfilled 还是 rejected ,包装实例才会结束。

(4)promise的缺点

Promise 也有一些缺点。首先,无法取消 Promise ,一旦新建它就会立即执行,无法中途取消。

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

第三,当处于 pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。

 
 

 

posted @ 2023-01-31 13:52  122www  阅读(64)  评论(0编辑  收藏  举报