promise.allsettled() 是异步请求异常聚合的核心方案,它等待所有 promise 完成(无论成功或失败),返回含 status、value/reason 的结果数组,确保不中断整体流程且保留各请求状态。

async/await 模式下做异步请求的异常聚合,核心是**不让单个失败中断整体流程,同时保留每个请求的结果(含错误)供统一分析**。直接用 try...catch 包裹多个 await 会串行阻断,而 Promise.all() 又因“一错全崩”无法聚合。真正实用的方式是把每个 Promise 的成功与失败都显式收进结果结构里。
用 Promise.allSettled() 收集全部状态
这是最直接、标准的方案。它不因某个请求失败而 reject,而是等所有 Promise 都 settle(fulfilled 或 rejected),返回一个包含每个结果对象的数组,每个对象带 status、value 或 reason 字段。
- 适合:需要知道“哪些成功、哪些失败、各自原因”的场景,比如批量提交表单、同步多条数据、健康检查等
- 写法简洁,无需手动封装,ES2020+ 原生支持
- 注意:返回结果顺序严格对应输入 Promise 的顺序,便于定位
示例:
async function fetchAllWithAggregate() {
const promises = [
fetch('/api/user'),
fetch('/api/profile'),
fetch('/api/settings')
];
const results = await Promise.allSettled(promises);
const aggregated = results.map((result, index) => ({
id: ['user', 'profile', 'settings'][index],
status: result.status,
data: result.status === 'fulfilled' ? result.value : null,
error: result.status === 'rejected' ? result.reason : null
}));
return aggregated;
}
手动封装 try/catch + 并行触发
如果需兼容较老环境(如 IE 或某些 Node.js 版本),或想自定义错误结构(比如加时间戳、请求路径),可对每个 Promise 单独 try/catch,并用 Promise.all() 并行发起。
- 每个请求独立兜底,失败不影响其他请求执行
- 返回统一格式对象,字段明确区分 success / error / message / response
- 避免在循环中逐个 await,否则变成串行,失去并发优势
示例:
async function safeFetch(url) {
try {
const res = await fetch(url);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return { success: true, data: await res.json() };
} catch (err) {
return { success: false, error: err.message, url };
}
}
async function aggregateMultiple() {
const urls = ['/api/a', '/api/b', '/api/c'];
const results = await Promise.all(urls.map(safeFetch));
return results;
}
按需组合:部分关键 + 部分容错
实际业务中并非所有请求都同等重要。比如「获取用户信息」失败应中断流程,但「加载推荐列表」失败可降级忽略。这时可混合使用:
- 关键请求用
await+try/catch保证流程可控 - 非关键请求用
Promise.allSettled或safeFetch并行执行,结果单独处理 - 最终聚合时,把关键步骤的错误优先抛出,非关键项作为 warning 日志或 UI 提示
例如登录后拉取主数据和侧边栏数据:主数据失败直接提示登录异常;侧边栏失败只隐藏模块,不阻断页面进入。
补充:错误上下文增强
单纯聚合错误还不够,生产环境建议附加必要上下文:
- 记录请求 URL、method、timestamp、traceId(如有)
- 对网络错误(TypeError)、HTTP 错误(4xx/5xx)、解析错误(JSON.parse 失败)分类标记
- 前端可将聚合后的错误上报监控系统,后端可结合 requestId 追踪完整链路
这样异常聚合就不仅是技术实现,更是可观测性的一环。











