await 不会阻塞主线程,而是挂起当前 async 函数并交出控制权,让事件循环继续执行其他任务;其后代码被包装为微任务,在 promise 解决后立即执行,优先级高于宏任务;本质是 promise 与事件循环的语法糖,不依赖多线程。

await 不会阻塞主线程,因为它根本不是“阻塞”,而是“挂起当前 async 函数、交出控制权”的协作式暂停。
它暂停的是函数,不是线程
await 只让当前 async 函数内部的后续代码暂停执行,JS 引擎会立即将控制权还给事件循环。此时主线程完全自由:可以响应点击、滚动页面、执行其他脚本、甚至渲染新帧。
- 比如 await fetch('/api') 发起请求后,JS 不等响应回来,马上去干别的事
- 浏览器底层用独立线程或 IO 完成端口处理网络,JS 主线程全程不参与等待
- 你能在 await 期间正常操作页面,就说明主线程没被锁住
靠微任务队列实现“恢复”
await 后面的代码不会消失,而是被自动包装成一个回调,放进微任务队列(microtask queue)。它会在当前宏任务(如一次 click 处理、一段同步脚本)结束后立即执行,优先级高于 setTimeout 等宏任务。
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- 这保证了逻辑顺序——await 之后的代码一定在 Promise 解决后运行,但不打断主线程
- 微任务清空是事件循环的一部分,不是额外开销,也不需要调度新线程
和真正阻塞有本质区别
对比 while 循环或 Thread.Sleep 这类操作:它们会让 JS 引擎原地空转,CPU 白耗,主线程彻底卡死,页面无法响应。
- await 是“我先歇会儿,你忙你的,好了叫我”
- while(true) 是“我站着不动,谁也别想动”
- 前者释放控制权,后者霸占控制权
async/await 是语法糖,底层仍是 Promise + 事件循环
写 await promise 等价于把后续代码塞进 promise.then(...)。它没有引入新机制,只是让异步流程更像同步写法,可读性提升,但运行模型完全透明、可预测。
- async 函数返回 Promise,调用它本身是同步的
- await 触发挂起,Promise 解决后触发微任务恢复
- 整个过程不依赖多线程,也不创建新线程










