await 不是语法糖,而是基于 promise 语义和事件循环调度的执行暂停机制;它解包 promise 终值、需 try/catch 捕获错误、串行 await 需显式用 promise.all 并发。

await 不是语法糖,而是 async/await 机制中真正执行“等待”行为的关键操作符,它依赖 Promise 语义和运行时调度,背后有明确的执行逻辑,不是编译期简单替换。
await 的本质是暂停函数执行,而非阻塞线程
当 JS 执行到 await expression 时,引擎会:
- 立即求值
expression,必须返回一个thenable(通常是 Promise); - 若该 Promise 已 fulfilled,直接提取其值,继续向下执行;
- 若 Promise 还未完成,当前 async 函数暂停(不阻塞主线程),控制权交还事件循环;
- 待 Promise settle 后,将结果(value 或 rejection)传入后续微任务,恢复函数执行。
await 后的结果是 Promise 的 value,不是 Promise 本身
这是最常被误解的一点:虽然 await 出现在 Promise 表达式前,但它解包的是 Promise 的终值:
-
const data = await fetch('/api').then(r => r.json())→data是 JSON 对象,不是 Promise; -
await Promise.resolve(42)直接得到42; - 即使
await后跟普通值(如await 123),也会被自动包装为Promise.resolve(123)再解包。
错误处理需配合 try/catch,reject 不会自动抛出
await 会把 Promise rejection 转为同步风格的异常,但必须显式捕获:
-
await Promise.reject('fail')等价于throw 'fail'; - 没写
try/catch就会触发未处理 rejection,可能报错或静默失败; - 不能用
.catch()链在await表达式后——那会捕获不到,因为 await 已经“消费”了 Promise。
多个 await 是串行的,想并发需提前构造 Promise
连续写 await a(); await b(); 会等 a 完成后再启动 b。要并行执行:
- 正确方式:
const [x, y] = await Promise.all([a(), b()]); - 错误方式:
await a(); await b()—— b 的调用时机晚于 a 结束; - 注意
Promise.allSettled或Promise.race也适用于不同并发策略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











