async/await 本身不支持部分失败仍继续执行,但可通过 Promise.allSettled()、独立 try/catch 或 .catch() 降级实现错误隔离:前者用于并行任务全执行,中者用于顺序降级,后者用于并行兜底,再配合全局 unhandledrejection 监听避免误报。

async/await 本身不支持“部分失败仍继续执行”的语义,但可以通过组合 Promise API 实现对多个异步任务中个别失败的隔离处理——关键不是让 await “跳过错误”,而是避免错误中断整个流程。
用 Promise.allSettled() 替代 Promise.all
当需要并行发起多个请求、且任一失败都不应阻断其余任务时,Promise.allSettled() 是首选:
- 它返回一个数组,每个元素包含对应 Promise 的
status("fulfilled" 或 "rejected")和value或reason - 无论成功或失败,所有任务都会执行完毕,不会因某个 reject 而提前终止
示例:
async function fetchBoth() {
const results = await Promise.allSettled([
fetch('/api/user').then(r => r.json()),
fetch('/api/orders').then(r => r.json())
]);
<p>const user = results[0].status === 'fulfilled' ? results[0].value : null;
const orders = results[1].status === 'fulfilled' ? results[1].value : [];</p><p>return { user, orders };
}为每个 await 单独加 try/catch
若需按顺序执行多个异步操作,又希望某一步失败不影响后续步骤,就不要把它们全塞进一个 try 块里,而是给每个 await 配独立的错误处理:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 适合有依赖关系但允许降级的场景(比如先取用户信息,失败则用默认头像;再取偏好设置,失败则跳过)
- 避免用单一 catch 捕获全部,否则无法区分哪个环节出错
示例:
async function loadProfile() {
let user = null;
try {
user = await fetch('/api/user').then(r => r.json());
} catch (e) {
console.warn('用户信息加载失败,使用空对象', e);
user = {};
}
<p>let preferences = {};
try {
preferences = await fetch('/api/prefs').then(r => r.json());
} catch (e) {
console.warn('偏好设置加载失败,使用默认值', e);
}</p><p>return { user, preferences };
}用 .catch() 提前“消化”单个 Promise 的拒绝
在 await 之前,就让 Promise 自己处理拒绝,返回兜底值(如 null、空数组、默认对象),这样 await 就不会抛异常:
- 适用于并行任务中希望失败后提供 fallback,而非中断流程
- 注意:.catch() 返回的是新 Promise,所以 await 的仍是“已决议”的 Promise
示例:
async function loadDashboard() {
const [user, stats, notifications] = await Promise.all([
fetch('/api/user').then(r => r.json()).catch(() => null),
fetch('/api/stats').then(r => r.json()).catch(() => ({})),
fetch('/api/notify').then(r => r.json()).catch(() => [])
]);
<p>return { user, stats, notifications };
}避免 unhandledrejection 报警干扰
即使你做了上述处理,若某处漏掉 catch 或未接住 .catch() 后的链式错误,仍会触发 unhandledrejection。建议在入口层统一监听并忽略已知可容忍的失败:
- 浏览器中:
window.addEventListener('unhandledrejection', e => { if (e.reason?.code === 'NETWORK_TIMEOUT') e.preventDefault(); }) - Node.js 中:
process.on('unhandledRejection', (reason) => { /* 记录但不 crash */ }) - 目的不是掩盖问题,而是防止监控误报,同时确保真正严重的问题仍能被捕获

















