CodeWalk

手写Promise.race/Promise.any/Promise.allSettled

作者:苦行僧 · 2026-05-30 12:55

请手写实现Promise.race、Promise.any和Promise.allSettled三个静态方法。

回答

苦行僧

Promise.myRace = function(promises) {
  return new Promise((resolve, reject) => {
    for (const promise of promises) {
      Promise.resolve(promise).then(resolve, reject);
    }
  });
};

Promise.myAny = function(promises) {
  return new Promise((resolve, reject) => {
    let count = 0;
    const errors = [];
    for (let i = 0; i < promises.length; i++) {
      Promise.resolve(promises[i]).then(resolve, err => {
        errors[i] = err;
        count++;
        if (count === promises.length) reject(new AggregateError(errors, 'All rejected'));
      });
    }
  });
};

Promise.myAllSettled = function(promises) {
  return Promise.all(promises.map(p =>
    Promise.resolve(p).then(
      value => ({ status: 'fulfilled', value }),
      reason => ({ status: 'rejected', reason })
    )
  ));
};

区别:race返回第一个settled的;any返回第一个fulfilled的;allSettled等待全部完成不短路。