Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 两个process.nexttick是否在同一个tick(aka frame)上运行?_Javascript_Node.js - Fatal编程技术网

Javascript 两个process.nexttick是否在同一个tick(aka frame)上运行?

Javascript 两个process.nexttick是否在同一个tick(aka frame)上运行?,javascript,node.js,Javascript,Node.js,请看以下代码: console.log(“a”) process.nextTick(()=>console.log(“b”); process.nextTick(()=>console.log(“c”); 这当然会打印a,然后打印b,然后打印ca是从与b和c不同的帧(勾号)写入的,但是b和c是从同一帧写入的吗 是这样的: 第1帧:写入a 第2帧:写入b,写入c 或者是这样的: 第1帧:写入a 第2帧:写入b 第3帧:写入c 谢谢 首先看一下这段代码: let racer = funct

请看以下代码:

console.log(“a”)
process.nextTick(()=>console.log(“b”);
process.nextTick(()=>console.log(“c”);
这当然会打印
a
,然后打印
b
,然后打印
c
<代码>a是从与
b
c
不同的帧(勾号)写入的,但是
b
c
是从同一帧写入的吗

是这样的:

  • 第1帧:写入
    a
  • 第2帧:写入
    b
    ,写入
    c
或者是这样的:

  • 第1帧:写入
    a
  • 第2帧:写入
    b
  • 第3帧:写入
    c

谢谢

首先看一下这段代码:

let racer = function() {
  setTimeout(() => console.log("timeout"), 0);
  setImmediate(() => console.log("immediate"));
  process.nextTick(() => console.log("nextTick"));
  console.log("current event loop");
}

racer()
结果是:

[Running] node "/Users/logicmason/timeouts.js"
current event loop
nextTick
timeout
immediate

[Done] exited with code=0 in 0.203 seconds
  • 第一个执行的是process.nextTick,它将其回调放在事件队列的前面。它将在当前正在执行的代码之后但在任何I/O事件或计时器之前执行

  • 接下来是“超时”。因为我们给setTimeout传递了一个0的超时,所以在执行之前没有额外的强制延迟,并且在下一个循环中它被放入计时器队列中

  • 最后,我们有setImmediate,它显然不像它的名字所暗示的那样直接!它的回调被放置在事件循环的下一个周期的检查队列中。由于检查队列晚于计时器队列,因此setImmediate将比setTimeout 0慢

总之,事件循环如下所示:

计时器->IO->轮询->检查->关闭->计时器->…

  • 计时器:从setInterval或setTimeout回调
  • IO回调:来自I/O事件的回调
  • 空闲:由节点在IO和轮询阶段之间内部使用
  • 轮询:检索新的I/O事件
  • 检查:在此处执行来自setImmediate的回调
  • 闭合:处理闭合连接,如插座
it挑战时间:)


首先看一下这段代码:

let racer = function() {
  setTimeout(() => console.log("timeout"), 0);
  setImmediate(() => console.log("immediate"));
  process.nextTick(() => console.log("nextTick"));
  console.log("current event loop");
}

racer()
结果是:

[Running] node "/Users/logicmason/timeouts.js"
current event loop
nextTick
timeout
immediate

[Done] exited with code=0 in 0.203 seconds
  • 第一个执行的是process.nextTick,它将其回调放在事件队列的前面。它将在当前正在执行的代码之后但在任何I/O事件或计时器之前执行

  • 接下来是“超时”。因为我们给setTimeout传递了一个0的超时,所以在执行之前没有额外的强制延迟,并且在下一个循环中它被放入计时器队列中

  • 最后,我们有setImmediate,它显然不像它的名字所暗示的那样直接!它的回调被放置在事件循环的下一个周期的检查队列中。由于检查队列晚于计时器队列,因此setImmediate将比setTimeout 0慢

总之,事件循环如下所示:

计时器->IO->轮询->检查->关闭->计时器->…

  • 计时器:从setInterval或setTimeout回调
  • IO回调:来自I/O事件的回调
  • 空闲:由节点在IO和轮询阶段之间内部使用
  • 轮询:检索新的I/O事件
  • 检查:在此处执行来自setImmediate的回调
  • 闭合:处理闭合连接,如插座
it挑战时间:)


不是节点方面的专家,但我一直认为
nextTick()
回调是在同一帧的末尾执行的,而
setImmediate()
是在开头执行的。这样一来,“第1帧:写入
a
,写入
b
,写入
c
”,您的第一个列表是
setImmediate
的结果,第二个列表是递归
setImmediate
的结果。我不是节点专家,但我一直认为
nextTick()
回调是在同一帧的末尾执行的,而
setImmediate()
则在开始时执行。这将使“第1帧:写入
a
,写入
b
,写入
c
”,第一个列表是
setImmediate
的结果,第二个列表是递归的
setImmediate
的结果。