MarsPen / blog

3 stars 0 forks source link

【手写篇 - Day 03】实现`Promise.allSettled()` #3

Open MarsPen opened 2 years ago

MarsPen commented 2 years ago

题目描述

Promise.allSettled()方法返回一个在所有给定的 promise 都已经 fulfilledrejected 后的 promise,并带有一个对象数组,每个对象表示对应的 promise 结果。

Promise.all() 不同,Promise.allSettled()会等待所有的 promise 直到fulfill 或者 reject

MarsPen commented 2 years ago

思路

代码

function allSettled(promises) {
    // 如果传入的参数为空,那么返回一个空的 Promise
  if (promises.length === 0) {
    return Promise.resolve([])
  }

  // 匹配传入的参数,如果是 Promise 对象,那么就返回 Promise 对象
  let promisesIterable = promises.map((item)=>{
    return item instanceof Promise ? item : Promise.resolve(item)
  })

  // 创建一个数组,用来存储所有的 Promise 的状态
  let results = []
  // 用来记录当前已经完成的 Promise 的数量
  let completed = 0
  return new Promise((resolve, rejected) => {
    // 循环遍历传入的参数,并且创建一个 Promise
    for (let i=0; i < promisesIterable.length; i++) {
      Promise.resolve(promisesIterable[i])
      .then((value)=>{
        results[i] = {status: 'fulfilled', value}
      })
      .catch((reason)=>{
        results[i] = {status: 'rejected', reason}
      })
      .finally(()=>{
        // 当所有的 Promise 都完成的时候,返回结果  并且调用 resolve
        completed++
        if (completed === promisesIterable.length) {
          resolve(results)
        }
      })
    }
  })
}

补充知识