首页 > 解决方案 > 这个例子中节点的执行顺序是什么

问题描述

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

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

评估为

1
3
2

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

节点js事件循环

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

标签: javascriptnode.jsevent-loop

解决方案


但是我不明白在哪里获取新的顺序指令适合那里?

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

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

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

是的。

如果是这样 - Node 在到达检查阶段之前会执行多少条这样的指令?

无穷多。

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

因此,以下代码将永远输出3,永远不会到达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 中有工作线程,浏览器中有服务工作线程,但它们存在于自己的环境中。

**: ...在此过程中消耗 100% 的一个 CPU 内核并且不对任何事件或信号做出反应,因此请将此仅视为学术兴趣的示例,而不是您在实际代码中编写的内容。


推荐阅读