async函数返回promise,可直接融入promise链;链内错误用.catch()捕获,函数体内用try/catch处理局部异常,二者分工协作而非替代。

async 函数本身返回 Promise,所以它天然能融入 Promise 链;但错误捕获方式要分清场景——链内用 .catch(),函数体内用 try/catch,两者不是替代关系,而是分工协作。
async 函数作为 Promise 链的一环
async 函数可以放在 .then() 里调用,它的返回值自动被 resolve 或 reject,错误也会沿链向后传递:
- 如果 async 函数内部 throw 或 await 的 Promise 被 reject,它返回的 Promise 就是 rejected 状态
- 这个 rejected Promise 会被链上后续的 .catch() 捕获,无需额外包裹
- 示例:
Promise.resolve().then(() => fetchData()).catch(handleError)—— fetchData 是 async 函数,出错直接进 catch
在 async 函数里主动用 try/catch 处理局部错误
当需要对某一步失败做特定响应(比如降级、重试、记录日志),而不是让整个链中断或统一兜底时,应在 async 函数内部加 try/catch:
- 多个 await 共享一个 try/catch 块,适合有依赖关系的串行操作
- 每个 await 单独 try/catch,适合并行任务中独立容错(如批量请求中某一个失败不影响其余)
- 注意:try/catch 只捕获 await 表达式抛出的错误,不捕获 Promise 构造器或定时器里的 throw
混合使用时的关键细节
常见组合方式和易错点:
- 链尾 .catch() 能捕获 async 函数内未被 try/catch 捕获的错误,也能捕获 .then() 回调里的同步异常(如 JSON.parse 失败)
- fetch 默认不因 404/500 reject,必须手动检查
res.ok并throw,否则 try/catch 和 .catch() 都收不到 - 避免在 Promise.all 中混用未 await 的 async 函数调用;应确保传入的是 Promise 实例,而非函数本身
- 不要在 forEach/map 里 await,改用 for…of 或 Promise.all + map,否则链式逻辑会断裂、错误无法集中捕获
全局兜底不能代替主动处理
unhandledrejection 事件只用于监控和日志,它无法阻止错误发生,也不能恢复流程:
- 业务关键路径建议在顶层 async 函数入口加 try/catch,配合分类处理(网络错误走缓存、格式错误给默认值)
- 并行任务多且需各自反馈时,优先选 Promise.allSettled(),再遍历结果分别判断 status
- 裸 Promise.reject() 或未 catch 的链式 Promise,会触发 unhandledrejection,但属于防御性补漏,不是主策略










