手写Promise.allSettled

4 阅读1分钟

题目描述

实现一个函数 allSettled:

  • 接收一个 Promise 数组。

  • 无论其中的 Promise 是成功(resolved)还是失败(rejected),该函数返回的 Promise 都必须等待所有任务结束。

  • 最终返回的结果应该是一个数组,数组中的每个元素描述了对应 Promise 的结果状态。

实现

function MyPromiseAllSettled(promises){
  const n = promises.length;
  const results = new Array(n);
  if (n === 0) return Promise.resolve([]);

  return new Promise((resolve, reject) => {

      let count = 0;
      for (const [index, promise] of promises.entries()){
        promise
          .then(value => {
            results[index] = {
              status: 'fulfilled',
              value: value
            };
          })
          .catch(reason => {
            results[index] = {
              status: 'rejected',
              reason: reason
            };
          })
          .finally(()=>{
            count++;
            if (count === n) {
              resolve(results);
            }
          })
      }
  })
}