官方节点文档解释了以下内容:
在当前操作完成后,无论事件循环的当前阶段如何,都将处理nextTickQueue。
考虑到这一点,我通过以下方式测试了process.nextTick()
:
const heapdump = require('heapdump');
let count = 0;
function snapshot(){
setTimeout(() => heapdump.writeSnapshot(), 5000)
}
process.nextTick(snapshot);
while(true){
count++
console.log(count);
}
我的目的是让process.nextTick(snapshot);
强制将快照函数包含到事件循环中,在无限while
循环期间调用自身。
为什么不发生这种情况?
答案 0 :(得分:0)
因为节点的事件循环是单线程的,所以不会发生这种情况,所以“下一个滴答”只会在无限while
处理完毕后才会发生,正如您可能已经猜到的那样,它永远不会发生。
这是因为node.js只能在这个单个线程中执行非阻塞I / O操作,但同步代码执行得很好,并且它会阻止事件循环的执行。
因此,在您的示例中,事件循环被阻止,等待while
循环完成,永远不会到达“下一个滴答”或下一阶段。