这些引用自 Nodejs 文档和博客。
如果立即计时器从正在执行的回调内部排队,则该计时器在下一次事件循环迭代之前不会被触发。
如果在 I/O 周期内调度,setImmediate() 将始终在任何计时器之前执行,与存在多少个计时器无关。
根据 Node 文档,setImmediate() 的回调应该在下一个tick中执行。然而,当它被安排在 I/O(又名 poll 阶段)时,setImmediate 的回调总是在定时器之前触发。
fs.readFile('xx', () => {
setTimeout(() => { console.log('2 timeout'); }, 0);
setImmediate(() => { console.log('1 Immediate'); });
});
> 1 Immediate
> 2 timeout
我的问题是它到底是如何工作的? setImmediate() 的回调是否在当前票证而不是下一个报价中执行,因此它会在计时器之前记录?
注意:我已阅读所有建议的现有帖子,但我没有看到任何帖子讨论在 I/O 阶段安排 setImmediate 的特定用例。
setImmediate()
回调在当前事件循环迭代中排队,而 setTimeout() 回调在下一个事件循环迭代中排队。这就是为什么 setImmediate() 回调在 setTimeout() 回调之前执行。
阅读更多详细信息此处。请参阅标题为 setImmediate() 与 setTimeout() 的部分。