await 按固定规则处理右侧表达式:先同步求值,若结果为 Promise 则暂停等待,否则立即返回该值;它只能用于 async 函数或模块顶层,且返回值恒为解包后的结果。

await 后面的表达式不是“等什么就写什么”,而是有一套明确、可预测的求值规则。它不关心你写的是 Promise 还是普通值,只按固定逻辑处理——理解这点,才能避免常见误用。
await 总是先求值,再决定是否等待
执行到 await 表达式时,JavaScript 引擎会同步执行右侧表达式(即立即计算),得到一个返回值;然后根据这个值的类型,决定下一步行为:
- 如果结果是一个 Promise(或 thenable 对象),await 就暂停当前 async 函数,等待它 settle(fulfilled 或 rejected);
- 如果结果是普通值(字符串、数字、null、undefined、对象、函数等),await 不等待,直接返回该值;
- 所有非 Promise 值都会被隐式包装成 Promise.resolve(value),但这个包装发生在 await 内部,对外不可见,也不影响“立即返回”的行为。
await 只对 Promise 类型触发暂停
所谓“暂停”,仅指 async 函数内部执行流的暂停,主线程依然自由运行。关键在于:只有当右侧表达式的结果是 Promise 实例(或具有 then 方法的 thenable),await 才真正起作用:
-
正确示例:
const data = await fetch('/api')→ fetch 返回 Promise,await 等待响应; -
常见误解:
const x = await 'hello'→ 字符串不是 Promise,x 直接得 'hello',无任何延迟; -
易错场景:
await someFunction()若该函数未返回 Promise(比如忘了 return 或返回了普通对象),await 就不会等,容易造成逻辑错位。
await 的返回值就是表达式的结果值
无论右侧是 Promise 还是普通值,await 表达式的最终值都是“解包后”的结果:
立即学习“Java免费学习笔记(深入)”;
- Promise.resolve(42) → await 返回 42;
- Promise.reject(new Error('fail')) → await 抛出该错误,不会返回值;
- 42 → await 返回 42(不包装、不延迟);
- { id: 1 } → await 返回该对象;
- undefined → await 返回 undefined。
不能脱离 async 函数使用
await 是语法层面的约束,不是运行时检查。它只能出现在 async 函数体内部(或 ES 模块顶层):
- 在普通函数里写 await → 直接 SyntaxError,解析阶段报错;
- 箭头函数加 async 才能用 await:
const fetchData = async () => { const res = await fetch('/'); }; - 模块顶层(Top-level await)允许在 .mjs 文件或现代打包环境中直接使用,但普通 script 标签中仍不支持。


















