async/await 的核心是让异步逻辑清晰、健壮、可维护:函数仅在需 await 时标记 async,避免冗余包装;每个 await 必配 try/catch;优先用 Promise.all 实现并发;return x 优于 return await x。

async/await 不是“写得像同步就行”,而是要让异步逻辑清晰、健壮、可维护。统一风格的核心,是把隐式行为显性化、把并发意图表达清楚、把错误边界划明白。
函数声明必须标记 async,且仅在真正需要 await 时使用
async 是语义标识,不是装饰。它告诉调用方:“我返回 Promise,你得 await 或 .then 处理”。哪怕函数只 return 一个 Promise,也应直接返回,不套 async/await:
- ✅ 推荐:function fetchUser() { return api.getUser(); }
- ❌ 避免:async function fetchUser() { return await api.getUser(); }
- ⚠️ 注意:async 函数内部 return 42 自动变成 Promise.resolve(42),无需手动包装
await 必须配对 try/catch,不依赖上层兜底
每个 await 表达式都可能抛出错误(网络失败、JSON 解析异常、空响应等),漏掉捕获就会中断流程或向上冒泡。单个 try/catch 可覆盖多个 await,但不能假设“前面成功,后面就一定行”:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- ✅ 推荐结构:try { const res = await fetch(url); const data = await res.json(); return data; } catch (err) { throw new Error(`加载失败: ${err.message}`); }
- ✅ 对非关键操作(如日志上报),可用 void (async () => { /* 忽略错误 */ })(); 防止阻塞主逻辑
并发控制要主动设计,不默认串行
连续写多个 await 是串行执行,总耗时为各请求之和;而合理使用 Promise.all 才能发挥并行优势:
立即学习“Java免费学习笔记(深入)”;
- ❌ 低效串行:await getUser(); await getPosts(); await getComments();
- ✅ 并行发起:const [user, posts, comments] = await Promise.all([getUser(), getPosts(), getComments()]);
- ✅ 混合策略:先发独立请求(user、settings),再 await 有依赖的请求(profile),最后统一 await 收集结果
避免冗余 await 和无意义 Promise 包装
return await x 与 return x 在行为上不同:前者会多一次微任务调度,延迟 resolve 时间;后者让调用方可自主决定 await 时机,更灵活:
- ✅ 更优写法:async function load() { return api.fetchData(); }
- ❌ 冗余写法:async function load() { return await api.fetchData(); }
- ⚠️ 注意:箭头函数、对象方法同样适用 async 声明,保持语法一致性

















