JavaScript 中階
Promise.all 是什麼?請實現 Promise.all
什麼是 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 評分
