setTimeout 和 setImmediate 之间的优先级

问题描述 投票:0回答:2

我在节点文档上读到了这篇文章:

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
javascript node.js
2个回答
3
投票

你应该检查这个github问题

事件循环的周期是定时器 -> I/O -> 立即数、冲洗和重复。 该文档是正确的但不完整:它没有提到这一点 当您还没有进入事件循环时(就像您的情况一样) 例如),那么计时器首先出现 - 但仅在第一个滴答声时出现。 (在 掌握。让事情变得复杂的是,事情的确定性稍差一些 在 v0.10 中。)


0
投票

在nodejs事件循环中,

主要有4个阶段。

  1. 定时器 => 设置超时、设置间隔
  2. Poll => I/O 回调(传入连接、数据、fs、加密、http.get 等)
  3. 检查=>立即设置
  4. Close => socket.on("close") 等

在每个阶段之前,Node.js 首先运行 process.nextTick() 并解决 Promise。

Nodejs 事件循环按计时器阶段 -> 轮询阶段 -> 检查阶段 -> 关闭阶段 -> 计时器阶段...的顺序运行。

在你的例子中:

process.nextTick() 首先运行。

之后,延迟为0的setTimeout会先于setImmediate运行,因为setTimeout处于Timer阶段,比setImmediate运行的Check阶段要早。

简单来说,定时器0的setTimeout先执行,setImmediate后执行。 不过,如果 setTimeout 的计时器大于 0,那么 setImmediate 将首先运行。

© www.soinside.com 2019 - 2024. All rights reserved.