我在节点文档上读到了这篇文章:
setImmediate(回调,[arg],[...])
安排在 I/O 事件回调之后以及 在
和setTimeout
之前“立即”执行回调setInterval
然而,我的看法恰恰相反。
setTimeout
在 setImmediate
之前执行。
有人对此行为有解释,或者有关于节点事件循环的任何文档吗?
谢谢:)
代码:
var index = 0;
function test(name) {
console.log((index++) + " " + name);
}
setImmediate(function() {
test("setImmediate");
})
setTimeout(function() {
test("setTimeout");
}, 0);
process.nextTick(function() {
test("nextTick");
})
test("directCall");
输出:
0 directCall
1 nextTick
2 setTimeout
3 setImmediate
你应该检查这个github问题
事件循环的周期是定时器 -> I/O -> 立即数、冲洗和重复。 该文档是正确的但不完整:它没有提到这一点 当您还没有进入事件循环时(就像您的情况一样) 例如),那么计时器首先出现 - 但仅在第一个滴答声时出现。 (在 掌握。让事情变得复杂的是,事情的确定性稍差一些 在 v0.10 中。)
在nodejs事件循环中,
主要有4个阶段。
在每个阶段之前,Node.js 首先运行 process.nextTick() 并解决 Promise。
Nodejs 事件循环按计时器阶段 -> 轮询阶段 -> 检查阶段 -> 关闭阶段 -> 计时器阶段...的顺序运行。
在你的例子中:
process.nextTick() 首先运行。
之后,延迟为0的setTimeout会先于setImmediate运行,因为setTimeout处于Timer阶段,比setImmediate运行的Check阶段要早。
简单来说,定时器0的setTimeout先执行,setImmediate后执行。 不过,如果 setTimeout 的计时器大于 0,那么 setImmediate 将首先运行。