Promise.all适用于同时发起多个相互独立的接口请求,全部成功后返回结果数组,任一失败则立即拒绝并抛出首个错误,需用try/catch捕获;容错场景应改用Promise.allSettled。

Promise.all 适合同时发起多个相互独立、无依赖关系的接口请求,等全部成功后再统一处理结果。它不会自动重试或处理部分失败,使用时需注意错误捕获和降级逻辑。
基本用法:传入 Promise 数组
Promise.all 接收一个由 Promise 实例组成的数组,返回一个新的 Promise:
- 所有子 Promise 都 fulfilled → 新 Promise 也 fulfilled,值为按顺序排列的结果数组
- 任意一个子 Promise rejected → 新 Promise 立即 rejected,值为第一个被拒绝的原因
示例:
const [user, posts, profile] = await Promise.all([fetch('/api/user').then(r => r.json()),
fetch('/api/posts').then(r => r.json()),
fetch('/api/profile').then(r => r.json())
]);
必须捕获错误:避免“静默失败”
只要有一个请求失败,Promise.all 就会中断并抛出错误,不加 try/catch 会导致未捕获异常:
立即学习“Java免费学习笔记(深入)”;
try {const results = await Promise.all([
fetch('/api/a').then(r => r.json()),
fetch('/api/b').then(r => r.json()),
fetch('/api/c').then(r => r.json())
]);
console.log('全部成功', results);
} catch (err) {
console.error('其中一个请求失败了', err); // err 是第一个失败请求的 error
}
需要容错?用 Promise.allSettled 替代
如果希望不管成功失败都等所有请求结束,并分别获取每个结果的状态,改用 Promise.allSettled:
- 返回数组,每个元素是 { status: 'fulfilled' | 'rejected', value | reason }
- 适合做“尽力而为”的批量请求(如上报、预加载、非关键数据)
fetch('/api/a').then(r => r.json()),
fetch('/api/b').then(r => r.json()),
fetch('/api/c').then(r => r.json())
]);
results.forEach((res, i) => {
if (res.status === 'fulfilled') {
console.log(`第${i+1}个成功`, res.value);
} else {
console.warn(`第${i+1}个失败`, res.reason);
}
});
进阶技巧:并发控制与超时保护
Promise.all 默认无并发限制,大量请求可能压垮服务或触发浏览器限制。可结合以下方式优化:
- 手动节流:把大数组分批,用 for 循环 + await Promise.all 处理每批
- 加超时:用 Promise.race 包裹单个请求 + setTimeout,防止某个接口卡死拖慢整体
- 取消能力:现代 fetch 支持 AbortController,可在 Promise.all 前统一配置 signal
简单超时示例:
function timeout(promise, ms) {return Promise.race([
promise,
new Promise((_, reject) =>
setTimeout(() => reject(new Error('请求超时')), ms)
),
]);
}
await Promise.all([
timeout(fetch('/api/a').then(r => r.json()), 5000),
timeout(fetch('/api/b').then(r => r.json()), 5000),
]);


















