async/await 通过将嵌套回调转为顺序执行,使异步代码如同步般直观;需确保每个 await 后是 Promise,显式表达依赖关系,统一用 try/catch 处理错误,并结合 for 循环或 Promise.all 合理处理并发与并行。

用 async/await 处理复杂回调地狱,核心是把“嵌套”变成“顺序”,让异步代码读起来像同步代码一样直白。它不改变异步本质,但大幅降低理解与维护成本。
把每层回调拆成独立 await 行
原来在 .then() 里层层传参的逻辑,现在直接赋值给变量即可。关键不是“去掉回调”,而是“让依赖关系显性化”:
- 每个 await 后必须是一个 Promise(比如 fetch()、res.json()、数据库查询)
- 前一步的结果可直接用于下一步,不用再塞进回调参数里
- 漏掉某一层 await(比如只写了 const res = await fetch(...),却忘了 await res.json())是常见错误,会导致后续拿到的是 Response 对象而非数据
统一用 try/catch 捕获所有错误
不再需要为每个 .then() 配一个 .catch(),也不用担心某一层没写错误处理就静默失败:
- 整个 async 函数体包在 try 块里,任何 await 抛出的异常都会被 catch 捕获
- 可以按业务逻辑做分层错误处理,比如用户不存在时提示友好消息,网络错误时重试
- 避免了“错误处理分散、遗漏、重复”的问题
处理循环中的异步依赖(如逐个查订单)
传统 forEach + 回调无法等待全部完成,而 for await of 或普通 for 循环配合 await 可自然解决:
- 如果数据源是异步可迭代对象(如 Stream、AsyncIterator),直接用 for await (const item of data)
- 如果是数组,用 for (let i = 0; i ,在循环体内 await 每次请求
- 避免用 arr.forEach(async () => { ... }) —— 它不会等待,只是并发发起请求,结果不可控
合理组合 Promise.all 提升并行效率
当多个异步操作彼此独立(比如同时拉取用户、配置、通知设置),用 Promise.all 并行执行,不牺牲可读性:
- const [user, config, notices] = await Promise.all([fetchUser(), fetchConfig(), fetchNotices()])
- 比串行 await 快得多,且仍保持线性结构
- 注意:Promise.all 任一失败则整体失败;如需“尽力而为”,可用 Promise.allSettled


















