async/await 通过 await 暂停 async 函数执行以等待 Promise 完成,天然实现异步任务串行依赖;需在 async 函数内使用,被 await 表达式须为 Promise,错误需 try/catch 或 .catch() 处理,并发场景优先用 Promise.all() 或 allSettled(),避免无依赖任务强行串行。

async/await 通过按顺序书写代码,让有依赖关系的异步任务自然地串行执行——后一个任务等前一个完成后再开始,不需要手动链式调用或嵌套回调。
用 await 等待前序 Promise 完成
当一个 async 函数中使用 await 调用一个 Promise,JavaScript 会暂停该函数的执行,直到这个 Promise settled(fulfilled 或 rejected),再继续向下运行。这就天然形成了依赖关系。
- 如果 taskA 返回 Promise,taskB 依赖 taskA 的结果,就直接写 const resultA = await taskA();,再写 const resultB = await taskB(resultA);
- await 只在 async 函数内有效,不能在顶层或普通函数里直接用
- 被 await 的表达式必须是 Promise(或 thenable),否则会被自动包装成 resolved Promise
错误需主动捕获,避免阻断后续逻辑
await 遇到 rejected Promise 会抛出异常,导致后续语句不执行。若希望失败后仍继续,要用 try/catch 包裹,或对特定 Promise 用 .catch() 处理。
- 推荐写法:try { const a = await fetchA(); const b = await fetchB(a); } catch (err) { console.error(err); }
- 若某步失败不影响后续,可单独处理:const a = await fetchA().catch(() => null); const b = await fetchB(a);
并发 + 依赖混合场景:先并发获取,再串行处理
多个无依赖的异步操作(如并行请求)可用 Promise.all() 提升效率;得到结果后,再用 await 串行执行依赖它们的后续任务。
- 例如:先并行拉取用户信息和订单列表,再根据两者生成报表:const [user, orders] = await Promise.all([fetchUser(), fetchOrders()]); const report = await generateReport(user, orders);
- 注意 Promise.all() 中任意一个 reject 会导致整个失败,如需容错,可改用 Promise.allSettled()
避免常见陷阱:不要用 await 包裹无关操作
如果两个异步任务彼此独立,却强行用 await 串行写,会白白增加总耗时。只有真正存在数据或执行顺序依赖时才用 await 连接。
- ❌ 错误(无依赖却串行):await api.getProfile(); await api.getNotifications(); → 实际可并发
- ✅ 正确(有依赖才串行):const profile = await api.getProfile(); const posts = await api.getPosts(profile.id);
- 可借助工具如 ESLint 插件 detect-unused-async-await 帮助识别冗余 await


















