async/await 不自动捕获并行任务的多个错误,因 await 遇第一个 rejected promise 即中断;应使用 Promise.allSettled 或手动包装每个 Promise 为 always-resolved,再统一处理结果与错误。

async/await 本身不自动捕获并行任务中的多个错误,因为 await 遇到第一个 rejected promise 就会抛出异常、中断后续执行。要捕获多个并行任务的错误,核心思路是:让每个任务独立失败,不互相阻断,再统一收集结果和错误。
用 Promise.allSettled 替代 Promise.all
Promise.all 一错即停,而 Promise.allSettled 会等待所有 promise 完成(fulfilled 或 rejected),返回每个结果的状态数组,天然支持多错误收集。
- 每个元素是
{ status: 'fulfilled', value: ... }或{ status: 'rejected', reason: Error } - 无需 try/catch 包裹整个调用,直接遍历结果即可区分成功与失败
- 适合“尽力执行、全量反馈”的场景,比如批量接口请求、文件上传等
手动包装每个 Promise 为 always-resolved
如果必须用 Promise.all,或需更精细控制错误格式,可对每个异步操作做“错误兜底”:
- 用
.then().catch()或自定义封装函数,把 reject 转为 resolve 并携带错误信息 - 例如:
async () => { try { return await api() } catch (e) { return { error: e } } } - 这样所有 promise 都 resolve,
await Promise.all([...])不会中断,再后处理判断哪些含 error 字段
结合 try/catch 与并行结构(慎用)
不推荐在 await 多个并行调用时逐个 try/catch(如 await f1(); await f2();),这实际是串行。真正并行需先发起所有任务,再 await 它们:
- 正确写法:
const [r1, r2] = await Promise.all([f1(), f2()]);—— 但此方式无法捕获多个错误 - 若坚持用 try/catch,应配合
Promise.allSettled或前述兜底包装,而非对每个 await 单独包 - 错误处理逻辑应放在收集结果之后,而非分散在每个 await 前
错误聚合与业务响应
拿到多个结果后,按需聚合错误并响应:
- 统计失败数量、提取错误消息、分类重试或告警
- 返回结构化响应,例如:
{ success: [], failed: [{ task: 'upload', error: 'timeout' }] } - 避免只抛出第一个错误掩盖其余问题,尤其在后台批处理中容易遗漏关键失败

















