Promise.allSettled 返回按输入顺序排列的对象数组,每个对象含 status('fulfilled'/'rejected')及对应 value 或 reason;需先判 status 再取值,避免直接解构或混合访问。

Promise.allSettled 返回的结果数组中,每个元素都是一个对象,通过 status 属性来区分状态:值为 'fulfilled' 表示成功,值为 'rejected' 表示失败。
返回结构的核心特征
allSettled 不会抛出错误,始终进入 .then()。结果数组与输入 Promise 的顺序严格一致,每个对象只含两个关键属性之一:
- 成功时:
{ status: 'fulfilled', value: 实际返回值 } - 失败时:
{ status: 'rejected', reason: 错误对象(如 Error 实例或字符串) }
如何安全读取每个结果
不能直接访问 value 或 reason,必须先判断 status:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
- 用
if (result.status === 'fulfilled')分支取result.value - 用
else if (result.status === 'rejected')分支取result.reason - 推荐用
switch或三元表达式避免属性访问错误
常见误操作提醒
以下写法容易出错:
- 直接解构
{ value } = result—— rejected 项没有value,会得undefined - 用
result.value ?? result.reason混合取值 —— 语义不清,且value可能本就是null或0 - 忘记检查
status就调用result.reason.message—— rejected 项才存在reason,fulfilled 项访问会报错
一个简洁的处理示例
假设发起三个请求:
const results = await Promise.allSettled([
fetch('/api/user'),
fetch('/api/posts'),
fetch('/api/invalid')
]);
results.forEach((res, i) => {
if (res.status === 'fulfilled') {
console.log(`第${i+1}个成功`, res.value);
} else {
console.warn(`第${i+1}个失败`, res.reason);
}
});
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










