await 不会阻塞线程,仅暂停所在 async 函数内后续代码执行,将控制权交还调用者,待 promise settle 后通过微任务恢复;同步及其他异步任务照常运行。

await 不会阻塞整个线程,而是暂停当前 async 函数内后续代码的执行,直到 Promise 状态变为 fulfilled 或 rejected。 它看起来像“阻塞”,实际是语法糖,底层基于 Promise 和微任务调度,不会冻结浏览器或 Node.js 主线程。
await 暂停的是所在 async 函数内部
遇到 await 时,JavaScript 引擎会:
- 立即暂停该 async 函数中 await 后面的语句(不执行)
- 把函数控制权交还给调用者,继续运行外层同步代码
- 等 Promise settle(完成或失败)后,将后续代码加入微任务队列,等待本轮事件循环结束执行
例如:
console.log('1');
async function foo() {
console.log('2');
await Promise.resolve();
console.log('3'); // 这行要等 Promise 完成后才执行
}
foo();
console.log('4');
// 输出顺序:1 → 2 → 4 → 3
await 不影响其他代码运行
它只对当前 async 函数内的代码有“暂停”效果,不会卡住:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 其他同步代码(如 console.log、for 循环)照常执行
- 其他异步任务(如 setTimeout、fetch、另一个 async 函数)并行推进
- UI 渲染、用户交互、定时器回调等完全不受影响
也就是说,await 不是“锁住线程”,而是“让出执行权 + 计划后续恢复”。
常见误解澄清
- 不是同步阻塞:不像 while(true) 或 alert() 那样让浏览器假死
- 不能用在普通函数里:必须在 async 函数或模块顶层(ES2022+)中使用
- await 后面不一定是 Promise:如果不是,会自动包装成 Promise.resolve(value)
- 错误需 try/catch 或 .catch():reject 会中断执行,不捕获会变成未处理拒绝
想真正“等待”再继续?正确写法
确保逻辑写在 await 后面,且函数本身是 async:
async function loadData() {
const res = await fetch('/api/data');
const data = await res.json(); // 等上一步完成,再执行这一步
render(data); // 这里才真正使用结果
}
如果写成非 async 函数里直接 await,会报语法错误;如果忘了 await,就变成了“发起请求但不等结果”,导致 data 是 Promise 对象而非真实数据。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










