You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
constp1=Promise.resolve(1)constp2=Promise.resolve(2)constp3=newPromise((resolve,reject)=>{setTimeout(reject,1000,'three');});Promise.all([p1,p2,p3]).then(values=>{console.log('resolve: ',values)}).catch(err=>{console.log('reject: ',err)})// reject: three
引言
本文从四个方面循序渐进介绍
Promise.allSettled
:Promise.all()
的缺陷Promise.allSettled()
Promise.allSettled()
与Promise.all()
各自的适用场景Promise.allSettled()
实现下面正文开始👇
Promise.all() 的缺陷
我们在之前的一篇文章中已经介绍过,当我们使用
Promise.all()
执行过个promise
时,只要其中任何一个promise
失败都会执行reject
,并且reject
的是第一个抛出的错误信息,只有所有的promise
都resolve
时才会调用.then
中的成功回调注意: 其中任意一个
promise
被reject
,Promise.all
就会立即被reject
,数组中其它未执行完的promise
依然是在执行的,Promise.all
没有采取任何措施来取消它们的执行但大多数场景中,我们期望传入的这组
promise
无论执行失败或成功,都能获取每个promise
的执行结果,为此,ES2020 引入了Promise.allSettled()
Promise.allSettled()
Promise.allSettled()
可以获取数组中每个promise
的结果,无论成功或失败当浏览器不支持
Promise.allSettled
,可以如此 polyfill:Promise.allSettled() 与 Promise.all() 各自的适用场景
Promise.allSettled()
更适合:reject
,对其它都没有影响promise
的执行结果Promise.all()
更适合:reject
,其它都失去了实际价值手写 Promise.allSettled 源码
与
Promise.all
不同的是,当promise
被reject
之后,我们不会直接reject
,而是记录下该reject
的值和对应的状态'rejected'
;同样地,当
promise
对象被resolve
时我们也不仅仅局限于记录值,同时也会记录状态'fulfilled'
。当所有的
promise
对象都已执行(解决或拒绝),我们统一resolve
所有的promise
执行结果数组Promise.allSettled 简写
由于 Promise.allSettled 判断数组元素太过于繁琐,所以这里可以直接使用 Promise.reslove 包装
总结
彼此相互依赖,一个失败全部失效(全无或全有)用
Promise.all
;相互独立,获取每个结果用Promise.allSettled
The text was updated successfully, but these errors were encountered: