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

