Promise.all适合批量请求但对失败敏感:任一reject即整体reject且不取消其余请求;成功时返回按序排列的结果数组,失败时仅抛出首个reject原因;需全量结果应改用Promise.allSettled。

Promise.all 适合批量发起多个请求并等待全部完成,但它对失败很敏感:只要有一个 Promise 被 reject,整个 Promise.all 就立即 rejected,其余还在进行中的请求不会被取消(只是结果不再被收集),你也就拿不到其他成功的响应。
成功时:返回所有 resolved 结果的数组
所有传入的 Promise 都 fulfilled 后,Promise.all 返回一个包含对应结果的数组,顺序与输入顺序严格一致:
const p1 = fetch('/api/user').then(r => r.json());
const p2 = fetch('/api/posts').then(r => r.json());
const p3 = Promise.resolve('hello');
Promise.all([p1, p2, p3])
.then(results => {
console.log(results); // [userObj, postsArr, 'hello']
});
失败时:只抛出第一个 reject 的原因
哪怕只有第一个请求失败,后两个已成功响应的数据也不会进入 then;catch 拿到的只是第一个失败 Promise 的 error:
const bad = Promise.reject(new Error('Network failed'));
const good = Promise.resolve(42);
Promise.all([bad, good])
.then(console.log)
.catch(err => console.error(err.message)); // 'Network failed'
注意:good 仍会正常 resolve,只是 Promise.all 不再关心它。
立即学习“Java免费学习笔记(深入)”;
想“全量获取”,改用 Promise.allSettled
如果你需要知道每一个请求最终是成功还是失败,且不希望任何一个失败中断整体流程,就该用 Promise.allSettled:
- 它总是返回一个对象数组,每个对象含 status 字段("fulfilled" 或 "rejected")
- fulfilled 项带 value,rejected 项带 reason
- 所有 Promise 都执行完才结束,无短路
Promise.allSettled([bad, good])
.then(results => {
results.forEach((r, i) => {
if (r.status === 'fulfilled') {
console.log(`第${i}个成功:`, r.value);
} else {
console.log(`第${i}个失败:`, r.reason.message);
}
});
});
需要“容错+聚合成功结果”?手动封装
若目标是忽略失败、只收集成功响应,可配合 Promise.allSettled 做过滤:
- 用 allSettled 获取全部终态
- filter 出 status === 'fulfilled' 的项
- map 提取 value 即可得到干净的成功结果列表
function allSucceed(promises) {
return Promise.allSettled(promises).then(results =>
results
.filter(r => r.status === 'fulfilled')
.map(r => r.value)
);
}
allSucceed([bad, good]).then(console.log); // [42]










