在 async 函数中同时处理多个 promise 错误,关键在于不让单个 reject 中断其余执行,推荐使用 promise.allsettled() 统一获取所有结果状态;也可用 promise.all() 配合封装成永不失效的 promise,或对每个 await 单独 try/catch 实现串行容错,并需按错误类型(网络、http、业务)分类响应。

在 async 函数中同时处理多个 Promise 错误,关键不是“阻止错误发生”,而是让错误不中断其他 Promise 的执行,并能统一收集、区分和响应它们。直接 await 多个 Promise 会因第一个 reject 而抛出异常,后续 Promise 不再执行——这不是“同时处理”,而是“提前终止”。真正的同时处理,依赖 Promise.allSettled() 或手动封装 + try/catch 分离。
用 Promise.allSettled() 获取全部结果(推荐)
它等待所有 Promise 结束(无论 fulfilled 还是 rejected),返回每个 Promise 的状态和值/原因,天然支持“同时发起、统一收尾”:
- 返回数组,每项含
status: 'fulfilled' | 'rejected',以及value或reason - 不会因某个失败而中断,所有请求并行发出、独立完成
- 适合需要知道“每一个”结果的场景,比如批量上传、并发校验
示例:
async function handleMultipleRequests() {
const promises = [
fetch('/api/user'),
fetch('/api/posts'),
fetch('/api/settings')
];
const results = await Promise.allSettled(promises);
results.forEach((result, index) => {
if (result.status === 'fulfilled') {
console.log(`请求 ${index} 成功:`, result.value);
} else {
console.error(`请求 ${index} 失败:`, result.reason);
}
});
}
用 Promise.all() + 封装成永不失效的 Promise
如果仍想用 Promise.all()(比如只关心全成功才继续),但又不想被单个失败阻断,可预先将每个 Promise 包装为“总是 resolve”的形式:
- 对每个 Promise 做
.then(v => ({ ok: true, data: v })).catch(e => ({ ok: false, error: e })) - 这样 Promise.all() 不会 reject,所有结果都能拿到,再统一判断
- 适合需要“全成功才走下一步”,但也要记录失败细节的逻辑
示例:
async function batchWithAll() {
const wrapped = [
fetch('/api/a').then(res => ({ ok: true, res })).catch(err => ({ ok: false, err })),
fetch('/api/b').then(res => ({ ok: true, res })).catch(err => ({ ok: false, err })),
];
const results = await Promise.all(wrapped);
const failed = results.filter(r => !r.ok);
if (failed.length > 0) {
console.warn('部分请求失败:', failed);
}
// 继续处理成功的 results
}
用 try/catch 分别包裹每个 await(适合少量、有顺序依赖)
当 Promise 之间有轻度依赖,或需按顺序发起但又不想因前一个失败导致后一个不执行时,可逐个 await 并各自捕获:
- 每个 await 独立 try/catch,互不影响执行流
- 适合“串行但容错”的场景,比如依次初始化模块,某个失败不影响后续
- 注意:这不是并发,而是串行容错;如需并发,请优先选前两种方案
示例:
async function serialWithErrorHandling() {
let user, posts, config;
try {
user = await fetch('/api/user').then(r => r.json());
} catch (e) {
console.error('用户加载失败', e);
}
try {
posts = await fetch('/api/posts').then(r => r.json());
} catch (e) {
console.error('文章加载失败', e);
}
try {
config = await fetch('/api/config').then(r => r.json());
} catch (e) {
console.error('配置加载失败', e);
}
return { user, posts, config };
}
错误分类与响应策略要提前设计
单纯捕获错误不够,还需根据错误类型决定行为:
- 网络错误(TypeError)、HTTP 错误(4xx/5xx)、业务错误(API 返回 { code: 1001 })应分开处理
- 可借助自定义 Error 类或检查
err.name、err.status、err.response?.status - 对可重试错误(如网络抖动),可在封装层加入简单重试逻辑;对不可重试错误(如 401),直接跳过或触发登出
不复杂但容易忽略。











