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

为何setImmediate函数晚于setTimeout执行?附代码验证示例

问题:Node.js中setImmediate执行晚于setTimeout的原因?

给出的代码如下:

setImmediate(() => {
    console.log("set immediate function calling")
})
setTimeout(() => {
    console.log("setTime out function")
}, 1000)
for (let i = 0; i <= 10000000000; i++) {

}
console.log("loop end")

执行结果:

loop end
setTime out function
set immediate function calling

分析与解答

这得从Node.js的事件循环机制说起:

  • 同步代码优先执行:所有同步代码会被优先处理。这里的for循环是同步阻塞操作,执行时间远超1秒,等它跑完才会打印loop end——这部分都属于事件循环启动前的同步执行阶段。

  • 定时器已到期:setTimeout的1秒延迟是从它被初始化的时间点开始计算的。因为for循环阻塞的时间超过了1秒,等同步代码全部执行完进入事件循环时,这个setTimeout的回调已经处于到期可执行状态,被放入了timers阶段的任务队列。

  • 事件循环有固定的阶段顺序:Node.js事件循环的执行阶段是按固定顺序来的,其中timers阶段(处理定时器回调)会优先于check阶段(处理setImmediate回调)运行。所以当同步代码执行完毕后,事件循环首先进入timers阶段,执行已经到期的setTimeout回调;之后才会进入check阶段,执行setImmediate的回调。

简单来说就是,漫长的同步循环让setTimeout的1秒延迟在同步阶段就耗尽了,事件循环启动后先处理到期的定时器任务,再处理setImmediate任务,因此出现了你看到的执行顺序。

内容的提问来源于stack exchange,提问作者Manish Rai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:37:18