在此示例中,节点的执行顺序是什么

问题描述 投票:1回答:1

在Node JS中展示setImmediate函数的功能的常见示例是以下代码

console.log('1');
setImmediate(() => console.log('2'));
console.log('3');

其结果为

1
3
2

据我所知,setImmediate回调是在事件循环的check阶段执行的

node js event loop

但是我不明白哪里可以找到新的顺序指令?我们是否保证Node将在执行检查阶段之前获取并执行console.log('3'),并因此在3之前打印2?如果是这样,那么节点将在到达check阶段之前执行多少条这样的指令?

javascript node.js event-loop
1个回答
2
投票

但是我不知道哪里可以找到新的顺序指令?

不需要获​​取任何新内容,因为此时所有指令都必须已经加载,因为我们已经在执行它们了!

  1. 确定您的代码应运行
  2. 您的代码(所有3行)运行
  3. 进入事件循环并检查还有什么要做
  4. 确定回调应运行
  5. 运行回调(所有“ 1行”)
  6. ...

我们是否保证Node将在执行检查阶段之前获取并执行console.log('3')并因此在2之前打印3?

如果是这样,那么在到达检查阶段之前,节点将执行多少条这样的指令?

无限多。

JavaScript是单线程的*,没有任何东西可以抢占您的代码(Ctrl + C除外)。

因此,以下代码将始终输出3,并且never一直输出到2

console.log('1');
setImmediate(() => console.log('2'));
while (true) {
  console.log('3');
}
1
3
3
3
3
... (forever)

类似地,以下代码将适用于所有永恒打印2A,但永远不会到达2B

console.log('1');
setImmediate(() => {
  while (true) {
    console.log('2A');
  }
});
setImmediate(() => console.log('2B'));
console.log('3');
1
3
2A
2A
2A
2A
... (forever)

((如果要在第一个回调内移动setImmediate(() => console.log('2B'));而不是将其放在下面,则同样适用。)>>

*:是的,node.js中有工作线程,浏览器中有服务工作线程,但它们生活在自己的环境中。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.