await 不阻塞线程但暂停当前 async 函数执行,仅在 async 函数内有效,本质是 Promise 语法糖,需配合微任务队列使用,传入非 Promise 值会自动包装,错误需 try/catch 捕获。

await 不会阻塞整个线程,但会暂停当前 async 函数内的后续代码执行,直到 Promise 解决。
await 只在 async 函数里有效
你不能在普通函数或全局作用域中直接写 await,否则会报 SyntaxError: await is only valid in async function。它本质是语法糖,底层仍基于 Promise 和微任务队列。
- 必须包裹在
async function内才能使用await - 顶层
await仅在 ES Module(如type="module"的 script 或 Node.js 的 .mjs 文件)中合法 - 在非模块环境(如普通 script 标签)中,顶层
await会直接报错
await 后面必须是 Promise(或 thenable)
await 会自动调用右侧值的 .then() 方法。如果传入的是普通值(比如数字、字符串),它会被包装成已解决的 Promise,不会等待。
async function example() {
console.log('start');
const a = await 42; // 立即继续,a === 42
const b = await Promise.resolve(100); // 效果同上
const c = await fetch('/api'); // 真正等待网络响应
console.log('end');
}
- 传入非 Promise 值:
await 123等价于Promise.resolve(123).then(v => v) - 传入 rejected Promise:会抛出错误,需用
try/catch捕获,否则导致 async 函数 rejection - 不要误以为
await someFunction()等价于someFunction().then(...)—— 它们语义相同,但错误传播和堆栈追踪行为有差异
await 不阻塞事件循环,但会“暂停”当前 async 函数
这是最容易误解的一点:await 让出控制权,把后续逻辑推入微任务队列,JS 引擎可以去处理其他任务(比如点击事件、定时器、其他 Promise 回调)。
立即学习“Java免费学习笔记(深入)”;
- 同一时刻只有一个
await在“等待”,但它不冻结浏览器或 Node.js 进程 - 多个并行请求别用串行
await,否则变慢:await a(); await b();→ 应改用await Promise.all([a(), b()]) - 调试时注意:DevTools 的“暂停在异常”可能跳过
await后的行,因为它们不在当前调用栈上
真正容易被忽略的是:await 的“暂停”只对当前函数体生效,不影响外部同步代码;而错误未捕获时,async 函数返回的 Promise 会处于 rejected 状态——这点常导致上层调用方没处理,静默失败。











