async/await 应全程统一使用,调用端也需 await 而非混合 .then();配合 try/catch 集中错误处理、promise.all 并行优化及返回值解构,才能真正提升异步代码可读性与维护性。

直接用 async/await 替代链式 .then(),能让异步逻辑回归线性阅读顺序,大幅降低理解成本。关键不是“用了 async”,而是调用端也统一用 await,配合结构化错误处理和并行优化,才能真正释放清晰度红利。
统一使用 await 而非混合 .then()
常见误区是只在封装层用 async,调用时仍写 .then()。这保留了 Promise 链的割裂感,没发挥语法糖优势。
- ❌ 不推荐:函数内用了 await,但外部还靠
.then()接收结果 - ✅ 正确做法:整个调用链都在 async 函数中,用 await 逐行等待
- 例如:获取用户数据后立即请求订单,应写成两行 await,而不是
getUser().then(u => getOrders(u.id))
用 try/catch 替代 .catch() 实现集中错误处理
多个异步步骤串联时,传统 .catch() 容易分散在各处,而 try/catch 让错误捕获位置明确、上下文完整。
- await 表达式失败会直接抛出异常,被外层 try/catch 捕获
- 适合多步依赖场景:比如先登录、再拉配置、最后初始化 UI,任一环节失败都进同一个 catch 块
- 避免重复写
.catch(e => handleError(e))多次
识别可并行操作,避免无谓串行等待
await 是“暂停当前函数”,不是“阻塞整个程序”。若多个请求互不依赖,强行串行 await 会拖慢整体耗时。
- ✅ 并行写法:
const [user, config] = await Promise.all([fetchUser(), fetchConfig()]) - ❌ 低效串行:
const user = await fetchUser(); const config = await fetchConfig(); - 注意:Promise.all 任一失败即整体 reject,如需容错可用
Promise.allSettled
返回值解构与语义简化
让 await 后的结果更贴近业务含义,减少冗余访问层级,提升可读性。
- API 返回结构常为
{ data: {...}, status: 200 },可在 await 后直接解构:const { data } = await api.get('/user') - 避免后续反复写
res.data.xxx,尤其在嵌套调用中 - 函数内部 return 解构后的业务对象,调用方拿到的就是干净数据,而非原始响应体
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











