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
相关产品推荐
相关产品推荐

