async/await 通过摊平 promise 链实现线性书写,减少约40%样板代码;自动包装返回值为 promise、统一错误处理、支持并发控制(如 promise.all),兼顾可读性、维护性与性能。

用 async/await 封装异步操作,核心是把 Promise 链式调用“摊平”,让多步异步逻辑回归线性书写习惯,从而直接削减冗余代码量。实际项目中,它不改变执行时长,但能减少约 40% 的样板代码,显著提升可读性和维护性。
用 async 统一函数签名,避免手动包装 Promise
传统 Promise 写法常需显式返回 new Promise 或链式 .then(),而 async 函数自动将返回值转为 Promise,省去包裹逻辑:
- 不用再写
return new Promise((resolve, reject) => { ... }) - 普通值(如字符串、对象)直接
return data,自动被Promise.resolve()包装 - 抛出错误自动触发 Promise rejection,无需手动调用
reject(e)
用 await 替代 then,消除嵌套与回调参数传递
多个依赖型异步操作(如 A → B → C)用 then 容易形成深层嵌套;用 await 可顺序展开,变量作用域更自然:
- 每个
await后直接得到解析后的值,不再需要then(res => { ... })提取参数 - 中间变量可直接复用,比如
const user = await getUser(); const profile = await getProfile(user.id); - 避免因多层
then导致的上下文丢失或作用域混乱
统一用 try/catch 处理异步与同步错误
Promise 的 catch 只捕获异步错误,而 try/catch 在 async 函数中能同时覆盖同步逻辑报错和 await 抛出的异常:
- 不需要在每个
then后单独加catch,也不用额外写.catch()链 - 校验逻辑(如
if (!user) throw new Error('not found'))可与异步调用共用同一套错误处理路径 - 配合
finally做收尾清理(如关闭 loading、重置状态),结构清晰且不易遗漏
合理并发:先创建 Promise,再 await,避免隐式串行
滥用 await 会让本可并行的任务变成串行,反而降低性能。减少冗余不只是删代码,更要写对逻辑:
- 若多个请求无依赖关系,应先调用所有 API 得到 Promise 实例,再
await Promise.all([p1, p2, p3]) - 避免连续写
await api1(); await api2(); await api3();—— 这不是简化,是性能退化 - 对容错要求高的场景,可用
Promise.allSettled替代all,保证部分失败不影响整体流程










