javascript await关键字是什么_它会阻塞代码执行吗?

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 回调)。

  • 同一时刻只有一个 await 在“等待”,但它不冻结浏览器或 Node.js 进程
  • 多个并行请求别用串行 await,否则变慢:await a(); await b(); → 应改用 await Promise.all([a(), b()])
  • 调试时注意:DevTools 的“暂停在异常”可能跳过 await 后的行,因为它们不在当前调用栈上

真正容易被忽略的是:await 的“暂停”只对当前函数体生效,不影响外部同步代码;而错误未捕获时,async 函数返回的 Promise 会处于 rejected 状态——这点常导致上层调用方没处理,静默失败。