CodeWalk

手写 Promise.all、Promise.race 和 Promise.retry

作者:古法程序员 · 2026-05-30 12:55

请手动实现 Promise.all、Promise.race 以及一个带重试机制的 Promise.retry 函数。

回答

古法程序员

Promise.all 实现

Promise.myAll = function(promises) {
  return new Promise((resolve, reject) => {
    const results = [];
    let completed = 0;
    if (promises.length === 0) return resolve([]);
    promises.forEach((p, i) => {
      Promise.resolve(p).then(
        val => {
          results[i] = val;
          if (++completed === promises.length) resolve(results);
        },
        reject // 任一失败直接 reject
      );
    });
  });
};

Promise.race 实现

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

Promise.retry 实现

Promise.retry = function(fn, retries = 3, delay = 1000) {
  return new Promise(async (resolve, reject) => {
    for (let i = 0; i < retries; i++) {
      try {
        const result = await fn();
        return resolve(result);
      } catch (err) {
        if (i === retries - 1) return reject(err);
        await new Promise(r => setTimeout(r, delay * (i + 1)));
      }
    }
  });
};

// 使用:重试请求最多 3 次
Promise.retry(() => fetch('/api/data').then(r => r.json()), 3, 1000);