CodeWalk

手写Promise.all完整实现

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

请手写实现Promise.all方法,需满足:1)所有resolve才resolve 2)任一reject就reject 3)保持结果顺序。

回答

苦行僧

Promise.myAll = function(promises) {
  return new Promise((resolve, reject) => {
    if (!Array.isArray(promises)) {
      return reject(new TypeError('promises must be an array'));
    }
    if (promises.length === 0) return resolve([]);
    
    const results = [];
    let completed = 0;
    
    promises.forEach((promise, index) => {
      Promise.resolve(promise).then(
        value => {
          results[index] = value;
          completed++;
          if (completed === promises.length) resolve(results);
        },
        reason => reject(reason)
      );
    });
  });
};

const p1 = Promise.resolve(1);
const p2 = new Promise(r => setTimeout(() => r(2), 100));
const p3 = 3;
Promise.myAll([p1, p2, p3]).then(console.log);

注意:1)使用Promise.resolve包装非Promise值;2)results保持输入顺序(用index赋值);3)空数组立即resolve([])。