推荐用 promise.allsettled() 处理多个并行任务的独立异常,它等待所有 promise 结束并返回每个结果的状态和值/原因,支持分别捕获错误、降级处理且不中断整体执行。

在 async 函数中处理多个并行任务的独立异常,核心是避免 await 阻塞链式执行、不因单个失败导致整体中断,并能分别捕获每个任务的错误。推荐用 Promise.allSettled() —— 它会等待所有 Promise 结束(无论成功或失败),并返回每个结果的状态和值/原因。
用 Promise.allSettled() 分别检查每个结果
它返回一个数组,每个元素形如 { status: 'fulfilled', value: ... } 或 { status: 'rejected', reason: ... }。你可以在 await 后遍历判断:
async function handleParallelTasks() {
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(`Task ${index} succeeded:`, result.value);
} else {
console.error(`Task ${index} failed:`, result.reason);
// 这里可做降级处理,比如用默认数据、重试、上报等
}
});
}
需要部分失败仍继续,但又想提前知道哪些出错?
如果不想等全部结束才开始处理(比如要立刻重试失败项),可结合 Promise.allSettled() 和后续逻辑分离:
- 先调用
Promise.allSettled()获取全部状态 - 筛选出失败项,单独发起重试或记录
- 对成功项直接使用其
value(注意:fetch 成功不代表 HTTP 状态码 OK,需额外检查response.ok)
不推荐用 Promise.all() 或 try/catch 包整个 await
Promise.all() 一有拒绝就短路,无法获取其他任务结果;而用 try/catch 包 await Promise.all([...]) 只能拿到第一个错误,其余任务状态丢失。这不是“独立异常处理”,而是“集体兜底”。
补充:手动包装单个 Promise 实现“永不拒绝”
若某些任务必须保证不中断流程(比如日志上报、埋点),可预先封装成总是 resolve 的版本:
function safe(promise) {
return promise
.then(value => ({ ok: true, value }))
.catch(reason => ({ ok: false, reason }));
}
// 使用
const [userRes, postRes] = await Promise.all([
safe(fetch('/api/user')),
safe(fetch('/api/posts'))
]);
if (!userRes.ok) console.warn('User fetch failed:', userRes.reason);
if (!postRes.ok) console.warn('Post fetch failed:', postRes.reason);
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











