在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将在执行检查阶段之前获取并执行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中有工作线程,浏览器中有服务工作线程,但它们生活在自己的环境中。