async/await 是 Promise 的语法糖,其核心价值在于统一执行流、提供可控错误边界和清晰模块契约;async 函数应专注封装异步操作并返回结构化结果,避免同步副作用与裸 Promise,用 try/catch 统一捕获错误,合理选择串行或并行逻辑,并通过 Promise 合约实现跨模块解耦。

async/await 确实是 Promise 的语法糖,但它远不止“写法更简洁”——它通过统一的执行流、可控的错误边界和清晰的模块契约,为构建稳定异步架构提供了结构基础。
明确 async 函数的职责边界
async 函数本质是返回 Promise 的函数,它的核心价值在于把异步操作“封装成可等待的单元”。不要在 async 函数里混写同步副作用(比如直接修改全局状态或 DOM),而应专注做一件事:发起异步操作并返回结构化结果。
- 导出的异步函数应始终返回有意义的值(如 { data, error } 或直接抛错),避免返回 undefined 或裸 Promise
- 避免在 async 函数内部使用 .then().catch(),这会破坏 await 的线性控制流
- 每个 async 函数都应有明确的输入(参数)和输出(resolve 值或 reject 逻辑),便于测试与复用
用 try/catch 统一捕获异步错误
await 会让 Promise 的 reject 变成同步异常,因此 try/catch 是最自然、最可靠的错误处理方式。它能捕获 Promise.reject()、throw new Error() 和未处理的 rejected Promise。
- 不要依赖外层 .catch() 处理内部 await 错误——那会丢失上下文和堆栈信息
- 在关键路径上(如用户登录、支付提交)必须包裹 try/catch,并记录错误或降级响应
- 可配合自定义错误类(如 ApiError、ValidationError)做类型化判断,提升错误处理精度
合理组织并发与串行逻辑
async/await 不自动决定执行顺序,你需要主动选择:用 for...of 实现串行(适合依赖前序结果),用 Promise.all 实现并行(适合独立请求),二者语义不同,选错会影响稳定性。
- 串行场景(如分页拉取 + 合并数据):用 for await...of 或普通 for 循环 + await,确保顺序与资源节流
- 并行场景(如同时获取用户、权限、配置):用 Promise.all([p1(), p2(), p3()]),但注意失败时默认全盘拒绝;可用 Promise.allSettled() 获取全部结果状态
- 避免在循环中无节制地创建 Promise(如 100 次 fetch),应加限流或分批处理
跨模块协作靠 Promise 合约,不是 await 本身
模块之间不靠 await 通信,而是靠“导出返回 Promise 的函数 + 调用方用 await 消费”这一契约。这是解耦的关键。
- 数据层模块导出 getUser(id) → 返回 Promise
- 业务层 import { getUser } from './api'; const user = await getUser(123);
- 组合多个模块逻辑时,用 async 函数封装协调逻辑,而非在各模块内硬编码调用链
- 避免模块间相互 await 形成隐式依赖,应通过参数传递或事件通知解耦


















