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.拓展
用法: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 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
本文来自博客园,作者:122www,转载请注明原文链接:https://www.cnblogs.com/131362wsc/p/17078390.html