Promise.all 的致命盲区:一个失败,全部作废
事故现场
JavaScript
// 批量获取用户详情
const userIds = [1, 2, 3, ..., 100];
const promises = userIds.map(id => fetchUser(id));
const users = await Promise.all(promises);
// 第 99 个请求 404,整个 Promise.all 直接 reject
// 前 98 个成功的结果,拿不到
结果: 页面白屏,用户体验崩盘。
对比:四种 Promise 组合方式
表格
方法 成功条件 失败行为 返回值
Promise.all 全部成功 一个失败,整体 reject 结果数组
Promise.race 任意一个 settled 无差别,最快为准 单个结果
Promise.any 任意一个成功 全部失败才 reject 单个结果
Promise.allSettled 无(永远成功) 记录每个状态 状态对象数组
正确方案:allSettled + 结果过滤
JavaScript
const results = await Promise.allSettled(
userIds.map(id => fetchUser(id))
);
// 分离成功和失败
const users = results
.filter(r => r.status === 'fulfilled')
.map(r => r.value);
const errors = results
.filter(r => r.status === 'rejected')
.map(r => r.reason);
console.log(成功 ${users.length} 个,失败 ${errors.length} 个);
// 页面正常渲染成功的,失败的显示占位或重试按钮

浙公网安备 33010602011771号