async/await 的简洁性源于将异步流程“拉平”为线性结构,使依赖、判断、循环、错误处理回归日常逻辑:多步依赖自然展开,条件与循环直写,Promise.all 显式控制并发,并发策略需主动设计避免隐式串行。

async/await 的简洁性不来自语法本身,而来自它把异步流程“拉平”成线性结构——让依赖、判断、循环、错误处理都回归日常逻辑表达方式。
让多步依赖自然展开,不再嵌套缩进
接口调用有先后顺序时,Promise 需靠 .then 一层层传递结果,容易漏 return、错作用域、括号失配;async/await 直接按执行顺序写,每一步的返回值就是下一行可直接用的变量:
- ✅ 正确写法:const user = await fetchUser();
const posts = await fetchPosts(user.id);
const comments = await fetchComments(posts[0].id); - ❌ Promise 链风险点:中间某步忘了 return,后续就收不到数据;this 或闭包变量在回调里容易丢失;错误捕获位置一错,整条链就静默失败。
条件与循环直写,不硬塞进 Promise 构造器
需要根据前序结果决定是否继续,或批量处理时逐个等待,async/await 允许直接用 if、for、while 控制流程,语义清晰:
- ✅ if 判断后 await:if (user.isPremium) { await loadAnalytics(); }
- ✅ for 批量请求:for (const id of ids) { const item = await fetchItem(id); list.push(item); }
- ✅ while 重试逻辑:let attempts = 0;
while (attempts
错误捕获集中且可控,避免分散 .catch
多个 await 可能分别在 fetch、json 解析、业务校验等环节失败,但一个 try/catch 就能覆盖全部,且可分层处理:
- ✅ 单层兜底:try { const res = await fetch(url); return await res.json(); } catch (e) { throw new Error('加载失败'); }
- ✅ 分级捕获:网络请求部分加重试,数据解析单独 catch 格式错误,不影响主流程;对上报类非关键操作,用 void (async () => {...})(); 忽略错误。
并发控制明确,避免无意串行拖慢性能
await 默认串行,但该并行时必须主动设计。是否提前创建 Promise,直接决定执行模型:
- ✅ 并发发起:const [a, b, c] = await Promise.all([api.getA(), api.getB(), api.getC()]);
- ✅ 混合策略:先发所有独立请求,再 await 依赖项,最后统一 await 收集结果,兼顾效率与依赖关系。
- ⚠️ 注意:连续 await 是串行,总耗时是各步骤之和;没加 Promise.all 却想并行,代码就悄悄变慢了。

















