我是node.js的新手,并试图了解事件循环。我们知道,process.nextTick()不是Event Loop的一部分。那么,任何人都可以解释在事件循环开始之前是否会执行process.nextTick()回调吗?请在解释中包含不同的node.js事件循环阶段状态。
process.nextTick(() => {
console.log("3")
console.log('nextTick');
});
console.log("close")
setTimeout(() => {
console.log("1")
console.log('timeout');
}, 0);
setImmediate(() => {
console.log("2")
console.log('immediate');
});
让我尝试 您可以在此处找到关于节点事件循环的简短(16分钟)说明: https://www.youtube.com/watch?v=PNa9OMajw9w&list=PLw5h0DiJ-9PCIrjcodoAZdA4CcCarnCOo&index=2 官方指南(@estus提到)是最好的解释: https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/ 有关更深入的解释,请查看以下系列博文: https://jsblog.insiderattack.net/event-loop-and-the-big-picture-nodejs-event-loop-part-1-1cb67a182810 根据official guide:
您可能已经注意到process.nextTick()没有显示在图中,即使它是异步API的一部分。这是因为process.nextTick()在技术上不是事件循环的一部分。相反,nextTickQueue将在当前操作完成后处理,而不管事件循环的当前阶段如何。 回顾一下我们的图,每当你在给定阶段调用process.nextTick()时,传递给process.nextTick()的所有回调都将在事件循环继续之前得到解决。
因此,process.nextTick()回调将在每个事件循环的tick中执行,而不是在事件循环开始之前执行。 让我用这个简单的程序演示:
process.nextTick(() => console.log("process.nextTick before"));
const intervalId = setInterval(() => {
console.log("interval");
process.nextTick(() => console.log("process.nextTick from interval"));
}, 1000);
process.nextTick(() => console.log("process.nextTick after"));
setTimeout(() => {
clearInterval(intervalId);
console.log("Interval was cleared - nothing more to run - the event loop will stop - program will stop");
}, 5000);
这是输出:
process.nextTick before
process.nextTick after
interval
process.nextTick from interval
interval
process.nextTick from interval
interval
process.nextTick from interval
interval
process.nextTick from interval
Interval was cleared - nothing more to run - the event loop will stop - program will stop
说明:
回到你的例子。 这是您的程序的输出:
close
3
nextTick
1
timeout
2
immediate
说明:
希望这个长期答案能让事情变得清晰。