# 实现Promise.allSettled()

作用:方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的promise结果。当有多个彼此不依赖的异步任务成功完成时,或者您总是想知道每个promise的结果时,就可以使用它。相比之下,Promise.all() 更适合彼此相互依赖或者在其中任何一个reject时立即结束的情况。

const promise1 = Promise.resolve('hello')
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 200, 'problem'))

Promise.allSettled([promise1, promise2])
  .then((values) => {
    console.log(values)
  })

// [
//   { status: 'fulfilled', value: 'hello' },
//   { status: 'rejected', reason: 'problem' }
// ]

自定义实现:

/**
 * @param {*} arr 待处理的promise数组
 */
const allSet = arr => {
  return new Promise((resolve) => {
    let result = []
    let index = 0

    const addIndex = (key, value, status) => {
      let obj = {
        status,
        value
      }
      result[key] = obj
      index++
      // 当数组全部处理完时,直接返回即可
      if (index === arr.length) {
        resolve(result)
      }
    }


    for (let i = 0; i < arr.length; i++) {
      let cur = arr[i]
      if (cur instanceof Promise) {
        // 记录该promise的状态
        cur.then(
          (value) => {
            addIndex(i, value, 'fulfilled')
          },
          (reason) => {
            addIndex(i, reason, 'rejected')
          }
        )
      } else {
        addIndex(i, cur, 'fulfilled')
      }
    }
  })
}


// 开始测试
const promise1 = Promise.resolve('success')
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 200, 'error'))
allSet([promise1, promise2])
  .then((values) => {
    console.log(values)
  })
// [
//   { status: 'fulfilled', value: 'hello' },
//   { status: 'rejected', value: 'problem' }
// ]