async/await串行中任一await被reject且未捕获则函数提前退出;可通过单个try/catch、.catch()降级、safeAwait封装、Promise.allSettled并发容错四种方式实现错误隔离与流程延续。

是的,多个 await 串行执行时,只要其中一个 Promise 被 reject(且未捕获),后续所有 await 都会跳过——函数提前退出,就像按下急停按钮。这不是 bug,而是 async/await 的默认行为:它把异步流程当作同步逻辑来建模,错误即中断。
每个 await 独立兜底:用 try/catch 包裹单个 await
最直接、最可控的方式,就是不让错误“冒泡”到函数顶层。为每个 await 单独配一个 try/catch,失败就记录、赋默认值、继续往下走。
- 适合逻辑强依赖顺序,但又允许部分步骤失败的场景(比如依次拉取用户信息、权限、配置)
- 变量需提前声明在 try 外,避免作用域问题
- 代码略冗长,但语义清晰、调试友好、无隐藏副作用
让 Promise 自己消化错误:用 .catch() 提前降级
把错误处理“下沉”到 Promise 构造层,让每个异步操作自己决定失败后返回什么(null、空数组、兜底数据),再 await 它们。
- 例如:
const user = await fetch('/user').catch(() => null) - 配合
Promise.all可实现并行+各自容错,比串行更高效 - 缺点是错误日志分散,需在 catch 里主动
console.error或上报
封装安全 await 工具:用 safeAwait 统一收口
把“try/catch + 默认值”逻辑抽成一个复用函数,让调用端干净利落:
- 写法类似:
const [err, data] = await safeAwait(fetch('/api')) - 返回数组形式,按需解构;err 存在即失败,data 可能是正常值或兜底值
- 一次封装,处处受益,大幅减少模板代码
批量并发不中断:用 Promise.all + return-rejected-as-value
如果多个请求彼此无关,只是需要一起发起,那就别用串行 await——改用 Promise.all 并行执行,并接受异常作为结果项。
- JavaScript 原生不支持 return_exceptions,但可用
Promise.allSettled替代(它永远 resolve,每个结果含 status 字段) - Node.js / Python 的
asyncio.gather(return_exceptions=True)是同理思路 - 关键好处:1 个失败 ≠ 全军覆没,剩余请求照常完成

















