javascript - 这个例子中节点的执行顺序是什么
问题描述
在 Node JS 中呈现 setImmediate 函数功能的常见示例是以下代码
console.log('1');
setImmediate(() => console.log('2'));
console.log('3');
评估为
1
3
2
据我所知,setImmediate 回调是在check
事件循环阶段执行的
但是我不明白在哪里获取新的顺序指令适合那里?我们是否保证 Node 会console.log('3')
在执行检查阶段之前获取并执行并因此3
在之前打印2
?check
如果是这样 - Node 在到达阶段之前会执行多少条这样的指令?
解决方案
但是我不明白在哪里获取新的顺序指令适合那里?
无需获取任何新内容,因为此时必须已经加载所有指令,因为我们已经在执行它们!
- 确定您的代码应该运行
- 您的代码(所有 3 行)运行
- 进入事件循环并检查还有什么可做的
- 确定回调应该运行
- 回调(所有“1 行”)运行
- ...
我们是否保证 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 内核并且不对任何事件或信号做出反应,因此请将此仅视为学术兴趣的示例,而不是您在实际代码中编写的内容。
推荐阅读
- java - Hibernate JPA 2 Metamodel Generator土耳其字符问题
- android - 片段中的 TabLayout 显示空白的白条
- firebase - 是否支持负载均衡?
- javascript - 有没有办法从单击更改为悬停在我的缩略图库上?
- python - 如何解析 XML 文件中的 VCARD
- user-interface - 可访问的对比度与企业标识指南
- c# - 订阅正在执行的任何方法
- angular - 我无法理解 ngFor 循环中索引值的作用以及它如何帮助创建动态表单字段
- python - 创建评分从 django 开始
- python - 导入错误 - ModuleNotFoundError: No module named 'model'