手写系列 - allSettled

170 阅读1分钟
class MyPromise {
  static allSettled(arr) {
    const res = []
    let count = 0;

    return new Promise((resolve, reject) => {
      for (let i = 0; i < arr.length; i++) {
        if (arr[i] instanceof Promise) {
          arr[i].then(value => {
            count++
            res[i] = { status: "resolve", value }
            if (count === arr.length) {
              resolve(res)
            }
          },
            reason => {
              count++
              res[i] = { status: "reject", reason }
              if (count === arr.length) {
                reject(res)
              }
            }
          )
        }
      }

    })
  }

}

let p1 = new Promise(function (resolve, reject) {
  setTimeout(function () {
    resolve(1)
  }, 1000)
})
let p2 = new Promise(function (resolve, reject) {
  setTimeout(function () {
    reject(2)
  }, 2000)
})
let p3 = new Promise(function (resolve, reject) {
  setTimeout(function () {
    resolve(3)
  }, 3000)
})

MyPromise.allSettled([p3, p1, p2]).then(res => {
  console.log(res) // [3, 1, 2, 0]
})