async/await 的核心优势是将多层嵌套异步逻辑转化为线性同步风格,提升可读性、错误处理统一性(try/catch)及控制流灵活性(if/for等),但需注意串行与并发的合理取舍。

async/await 在处理多层嵌套异步逻辑时,核心优势是把“层层回调”或“链式 .then”转化成接近同步代码的线性结构,逻辑清晰、错误可控、调试友好。
让依赖链变直:顺序执行自然又直观
当请求 B 依赖请求 A 的结果、请求 C 又依赖 B 的结果时,传统回调或 Promise 链容易形成缩进加深、return 层级混乱的问题。async/await 直接用 await 逐个等待,变量可直接赋值、复用,语义一目了然。
- 每个 await 后面跟一个 Promise,函数暂停执行,等它 resolve 后再继续下一行
- 中间结果可像普通变量一样参与计算、条件判断或传参
- 不再需要把后续逻辑塞进 .then() 回调里,避免“向右漂移”
错误处理集中统一:try/catch 就够用
多层嵌套中最头疼的是错误散落在各处——Promise 链要靠 .catch() 捕获,回调里得每层写 error 参数。async/await 把整个流程纳入 try 块,任意一层 reject 都会触发 catch,无需重复兜底。
- reject 的 Promise 被 await 时,等效于 throw,直接跳出 try 进入 catch
- 可以在 catch 中统一记录日志、降级处理或抛出新错误
- 如果只想捕获某一步失败而不中断流程,可用 .catch() 局部兜底再返回默认值
支持灵活控制流:if/for/while 都能照常写
Promise 链难以表达条件分支或循环重试,往往要拆成多个函数或嵌套 if。async/await 允许在异步函数内部自由使用同步语法结构,逻辑组织更符合直觉。
- 比如根据 API 返回状态决定是否发起下一次请求,直接写 if (res.code === 200) {...}
- 批量请求可配合 for...of 或 for 循环 + await,按需串行;也可用 Promise.all 并行,再 await 解构
- 重试逻辑可封装为带 while 循环的 async 函数,失败后 await sleep 再重试
不等于万能:注意串行性能与并发取舍
await 默认是串行等待,虽然写法简洁,但若多个请求彼此独立,全用 await 会白白拉长总耗时。这时候需主动识别依赖关系,该并行的地方用 Promise.all。
- 有依赖 → 用 await 顺序等待(如先登录再拿 token 请求数据)
- 无依赖 → 用 Promise.all([...promises]) 并发发出,再 await 解构结果
- 混合场景:可先并发获取基础数据,再用 await 处理后续依赖步骤


















