async/await 是异步编程语法糖,使代码形似同步但不阻塞主线程;需在 async 函数内使用 await,自动返回 promise;await 后接 promise 会暂停执行直至完成,非 promise 则立即转为 resolved;错误用 try/catch 捕获;多请求可用 promise.all 并发处理。

async/await 本身不是“同步化”,而是让异步代码写起来像同步代码,同时保持异步本质——不阻塞主线程。关键在于用 async 函数包裹逻辑,用 await 暂停执行等待 Promise 完成,但整个过程仍是非阻塞的。
async 函数是基础容器
必须把使用 await 的代码放在 async 函数里,否则语法报错。async 函数自动返回 Promise,即使 return 普通值也会被包装成 resolved Promise。
- 函数声明前加 async:`async function fetchData() { ... }`
- 箭头函数也支持:`const loadData = async () => { ... }`
- 不能在全局作用域或普通函数中直接写 await(ES2022 起支持顶层 await,仅限模块环境)
await 等待 Promise 结果,但不卡住线程
await 后面跟一个 Promise(或任意值)。如果是 Promise,它会暂停当前 async 函数的执行,等它 settle(fulfilled 或 rejected)后再继续;如果不是 Promise,会立即转为 resolved Promise 并继续。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 正确用法:`const data = await fetch('/api/user').then(r => r.json())`
- 错误写法:`const data = await fetch('/api/user').json()` —— 因为
.json()返回 Promise,但fetch()本身也是 Promise,应链式处理或 await 两次 - 实际等价于:`const res = await fetch('/api/user'); const data = await res.json();`
错误处理要用 try/catch,不是 .catch
await 抛出的异常会冒泡到最近的 try/catch,这比链式 .then().catch() 更接近同步写法的错误捕获习惯。
- 推荐写法:try { const data = await apiCall(); } catch (err) { console.error(err); }
- 避免混合:不要对同一个 await 同时写 .catch 和 try/catch,容易逻辑混乱
- 多个请求并行时,可配合 Promise.all:`const [a, b] = await Promise.all([fetchA(), fetchB()]);`
注意执行顺序和并发控制
await 是串行的,但你可以主动控制是否并发。比如循环中逐个 await 是串行,用 map + Promise.all 是并发。
- 串行(一个接一个):
for (const id of ids) { await getUser(id); } - 并发(一起发请求):
const users = await Promise.all(ids.map(getUser)); - 有节流需求?可用 p-limit、Promise.allSettled 或手写批处理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










