JavaScript 中階

Promise.all 是什麼?請實現 Promise.all

AI 練習作答

什麼是 Promise.all()?

Promise.all(iterable) 接受一個可迭代的 Promise 陣列,並回傳一個新的 Promise:

  • 全部 Promise 都 fulfilled,則以所有結果依原始順序組成的陣列 resolve
  • 任一 Promise rejected,則立即以該錯誤 reject(快速失敗)

基本用法

const p1 = Promise.resolve(1);
const p2 = Promise.resolve(2);
const p3 = Promise.resolve(3);

Promise.all([p1, p2, p3]).then(values => {
  console.log(values); // [1, 2, 3]
});

// 並行發送多個 API 請求(效率遠高於依序等待)
async function loadAll() {
  const [users, posts, comments] = await Promise.all([
    fetch('/api/users').then(r => r.json()),
    fetch('/api/posts').then(r => r.json()),
    fetch('/api/comments').then(r => r.json()),
  ]);
  console.log(users, posts, comments);
}

快速失敗範例

const p1 = Promise.resolve('success');
const p2 = Promise.reject(new Error('failed'));
const p3 = Promise.resolve('also success');

Promise.all([p1, p2, p3])
  .then(values => console.log(values))        // 不會執行
  .catch(err => console.error(err.message));  // 'failed'

實現 Promise.all()

function myPromiseAll(promises) {
  return new Promise((resolve, reject) => {
    if (!promises.length) 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);
          }
        })
        .catch(reject);  // 任一失敗即 reject
    });
  });
}

與相關方法比較

方法 行為
Promise.all() 全部成功才 resolve;任一失敗則立即 reject
Promise.allSettled() 等待全部完成,回傳每個 Promise 的結果(成功或失敗)
Promise.any() 任一成功即 resolve;全部失敗才 reject
Promise.race() 最快完成(不論成敗)的結果

✦ AI 模擬面試

輸入你的答案,AI 即時分析精準度與改進空間

登入後即可使用 AI 評分