手撕Promise.allSettled

最近面试被问到Promise.all怎么获取成功和失败的结果,实际上Promise.all是无法做到,但是处于提案阶段的Promise.allSettled正好可以满足这个场景。其实现原理和Peomise.all大同小异,无非是在resolve或者reject时做一个判断,判断所有的promise是否都已经处理完,处理完即可改变Promise的状态,返回结果。

Promise.allSettled = function (promises) {
  return new Promise(resolve => {
    let count = 0;
    const length = promises.length;
    const result = [];
    promises.forEach((promise, index) => {
      Promise.resolve(promise).then(value => {
        count++
        result[index] = { status: 'fulfilled', value }
        if (count === length) {
          resolve(result)
        }
      }, reason => {
        count++
        result[index] = { status: 'rejected', reason }
        if (count === length) {
          resolve(result)
        }
      })
    })
  })
}

const p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("123")
  }, 500);
})
const p2 = new Promise((resolve, reject) => {
  reject("456")
})
const p3 = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject("789")
  }, 2000);
})

Promise.allSettled([Promise.resolve('resolve'), p1, 'abc', p2, p3, Promise.reject('error')])
  .then(res => {
    console.log(res)
  })
原文地址:https://www.cnblogs.com/zt123123/p/14142568.html