我有这样的代码:
setTimeout(() => {
console.log(1)
process.nextTick(() => {
console.log('1-1')
})
}, 0)
setTimeout(() => {
console.log(2)
process.nextTick(() => {
console.log('2-2')
})
}, 0)
有些文章说控制台是
1 2 1-1 2-2
。但我自己写了,得到了1 1-1 2 2-2
(NodeJs V16.13.2)。
那么,事件循环在执行完所有计时器回调后执行微任务吗?或者只执行一次定时器回调后执行所有微任务?
这是版本不同导致的问题吗?我想要一个真正的答案,谢谢。
在您提供的代码中,有两个 setTimeout 回调计划有 0 毫秒的延迟。这些回调被放置在 Node.js 事件循环的“计时器阶段”中。当事件循环开始处理“计时器阶段”时,它会执行第一个 setTimeout 回调,该回调将“1”记录到控制台。在执行 setTimeout 回调之后,事件循环会检查是否有任何微任务,找到 process.nextTick 回调,该回调是在Microtasks 阶段执行第一个 setTimeout 回调期间安排的。然后事件循环执行这个微任务,将“1-1”记录到控制台。继续执行,事件循环进入第二个 setTimeout 回调,该回调将“2”记录到控制台。在第二个 setTimeout 回调之后,事件循环再次检查微任务,找到第二个 process.nextTick 回调,该回调是在Microtasks 阶段执行第二个 setTimeout 回调期间调度的。事件循环执行此微任务,将“2-2”记录到控制台。