async/await 的核心是用线性代码显式表达异步依赖关系,消灭语法嵌套而非逻辑嵌套;支持变量复用、集中错误处理(try/catch)、自然控制流(if/for/while)及灵活并发控制(await 串行或 promise.all 并发)。

用 async/await 处理复杂嵌套异步逻辑,关键不是“避免嵌套”,而是把原本散落在各层回调里的依赖关系,用线性代码显式表达出来。它不消灭逻辑嵌套,但消灭了语法嵌套。
让依赖链变直:用 await 逐层取值
当 B 必须等 A 返回结果、C 又依赖 B 的输出时,传统写法容易缩进加深或 .then 堆叠。async/await 直接按顺序写,中间结果可直接赋值、判断、传参:
- 每一步 await 后面跟一个 Promise,函数暂停执行,等 resolve 后继续下一行
- 变量像普通变量一样复用,比如 const token = await login(); const user = await fetchUser(token);
- 不再需要把后续逻辑塞进 .then 回调里,避免“向右漂移”
错误处理集中化:try/catch 覆盖整条链
多层异步中最容易漏掉错误兜底。async/await 把整个流程纳入一个 try 块,任意一层 reject 都会触发 catch:
- reject 的 Promise 被 await 时,等效于 throw,直接跳出 try 进入 catch
- 可在 catch 中统一记录日志、返回默认值或抛出新错误
- 若只想捕获某一步失败而不中断流程,可用 .catch(() => defaultValue) 局部兜底再继续
灵活控制流:if/for/while 照常写
Promise 链难以自然表达条件分支或循环重试,async/await 允许在函数内部自由使用同步语法结构:
- 根据 API 返回状态决定是否发起下一次请求:if (res.code === 200) { await uploadFile() }
- 批量请求可选串行(for...of + await)或并行(Promise.all([...]))
- 重试逻辑可封装为带 while 循环的 async 函数,失败后 await sleep 再重试
注意串行与并发的取舍
await 默认是串行等待,写法简洁但未必高效。需主动识别依赖关系:
- 有依赖 → 用 await 顺序等待(如先登录再请求数据)
- 无依赖 → 用 Promise.all([p1, p2, p3]) 并发发出,再 await 解构结果
- 混合场景:先并发获取基础数据,再用 await 处理后续依赖步骤











