You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中await表达式为何未触发setImmediate与setTimeout回调执行?

为什么setImmediate和setTimeout回调在这段代码中未执行?

先看这段代码:

async function a() {
  console.log("started");
  while (true) {
    await "c";
  }
}

setImmediate(() => console.log("setImmediate"));
setTimeout(() => console.log("setTimeout"), 0);
a();

console.log("duh");

它的输出是:

started
duh

问题出在微任务与宏任务的执行顺序上:

  • 当你await "c"时,JavaScript会把这个非Promise值包装成已resolved状态的Promise,对应的回调(也就是循环的下一次迭代)会被放入微任务队列。
  • Node.js的事件循环规则是:每次处理完当前阶段的宏任务后,会先清空所有微任务队列里的任务,才会推进到下一个阶段处理其他宏任务。
  • 这里的while循环是死循环:每次处理完一个微任务(循环的下一次迭代),又会立刻生成新的微任务(下一次await的回调),导致微任务队列永远无法清空。
  • 而setImmediate和setTimeout属于宏任务,它们的回调一直在宏任务队列排队,根本没机会被执行——事件循环永远卡在处理微任务的环节,没法推进到处理宏任务的阶段。

简单来说:你的死循环通过不断生成微任务“占满”了事件循环,宏任务根本轮不上执行。

内容的提问来源于stack exchange,提问作者Cheam Jing-En

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 12:24:51