Promise.all的瑕疵了解

我们在之前的一篇文章中 面试官问:Promise.all 使用、原理实现及错误处理 已经介绍过,当我们使用 Promise.all() 执行过个 promise 时,只要其中任何一个promise 失败都会执行 reject ,并且 reject 的是第一个抛出的错误信息,只有所有的 promise 都 resolve 时才会调用 .then 中的成功回调


  1. const p1 = Promise.resolve(1) 
  2. const p2 = Promise.resolve(2) 
  3. const p3 = new Promise((resolve, reject) => { 
  4.   setTimeout(reject, 1000, 'three'); 
  5. }); 
  6.  
  7. Promise.all([p1, p2, p3]) 
  8. .then(values => { 
  9.     console.log('resolve: 'values
  10. }).catch(err => { 
  11.     console.log('reject: ', err) 
  12. })  
  13.  
  14. // reject:  three 

注意:其中任意一个 promise 被 reject ,Promise.all 就会立即被 reject ,数组中其它未执行完的 promise 依然是在执行的, Promise.all 没有采取任何措施来取消它们的执行

但大多数场景中,我们期望传入的这组 promise 无论执行失败或成功,都能获取每个 promise 的执行结果,为此,ES2020 引入了 Promise.allSettled()

Promise.allSettled()

Promise.allSettled() 可以获取数组中每个 promise 的结果,无论成功或失败


  1. const p1 = Promise.resolve(1) 
  2. const p2 = Promise.resolve(2) 
  3. const p3 = new Promise((resolve, reject) => { 
  4.   setTimeout(reject, 1000, 'three'); 
  5. }); 
  6.  
  7. Promise.allSettled([p1, p2, p3]) 
  8. .then(values => { 
  9.     console.log(values
  10. })  
  11.  
  12. /* 
  13.   {status: "fulfilled", value: 1},  
  14.   {status: "fulfilled", value: 2},  
  15.   {status: "rejected", reason: "three"
  16. */ 

当浏览器不支持 Promise.allSettled ,可以如此 polyfill:


  1. if (!Promise.allSettled) { 
  2.   const rejectHandler = reason => ({status: "rejected", reason}) 
  3.   const resolveHandler = value => ({status: "fulfilled", value}) 
  4.   Promise.allSettled = promises => 
  5.     Promise.all
  6.       promises.map((promise) => 
  7.         Promise.resolve(promise)  
  8.           .then(resolveHandler, rejectHandler) 
  9.       ) 
  10.       // 每个 promise 需要用 Promise.resolve 包裹下 
  11.       // 以防传递非 promise 
  12.     ); 
  13.  
  14. // 使用 
  15. const p1 = Promise.resolve(1) 
  16. const p2 = Promise.resolve(2) 
  17. const p3 = new Promise((resolve, reject) => { 
  18.   setTimeout(reject, 1000, 'three'); 
  19. }) 
  20. const promises = [p1, p2, p3] 
  21. Promise.allSettled(promises).then(console.log) 
【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章