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慢
- 计时器:从setInterval或setTimeout回调
- IO回调:来自I/O事件的回调
- 空闲:由节点在IO和轮询阶段之间内部使用
- 轮询:检索新的I/O事件
- 检查:在此处执行来自setImmediate的回调
- 闭合:处理闭合连接,如插座
首先看一下这段代码:
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慢
- 计时器:从setInterval或setTimeout回调
- IO回调:来自I/O事件的回调
- 空闲:由节点在IO和轮询阶段之间内部使用
- 轮询:检索新的I/O事件
- 检查:在此处执行来自setImmediate的回调
- 闭合:处理闭合连接,如插座
不是节点方面的专家,但我一直认为
nextTick()
回调是在同一帧的末尾执行的,而setImmediate()
是在开头执行的。这样一来,“第1帧:写入a
,写入b
,写入c
”,您的第一个列表是setImmediate
的结果,第二个列表是递归setImmediate
的结果。我不是节点专家,但我一直认为nextTick()
回调是在同一帧的末尾执行的,而setImmediate()
则在开始时执行。这将使“第1帧:写入a
,写入b
,写入c
”,第一个列表是setImmediate
的结果,第二个列表是递归的setImmediate
的结果。