了解Node.Js事件循环执行
我是node.js新手,正在尝试理解事件循环。正如我们所知,process.nextTick()不是事件循环的一部分。所以,有人能解释一下process.nextTick()回调是否会在事件循环开始之前执行吗?请在说明中包括不同的node.js事件循环阶段状态了解Node.Js事件循环执行,node.js,event-loop,Node.js,Event Loop,我是node.js新手,正在尝试理解事件循环。正如我们所知,process.nextTick()不是事件循环的一部分。所以,有人能解释一下process.nextTick()回调是否会在事件循环开始之前执行吗?请在说明中包括不同的node.js事件循环阶段状态 process.nextTick(() => { console.log("3") console.log('nextTick'); }); console.log(
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分钟)说明:
官方指南(由@estus提及)是最好的解释:
要获得更深入的解释,请查看这一系列博客帖子:
根据: 您可能已经注意到process.nextTick()没有显示在图表中,即使它是异步API的一部分。这是因为process.nextTick()从技术上讲不是事件循环的一部分。相反,无论事件循环的当前阶段如何,都将在当前操作完成后处理nextTickQueue。
回顾我们的图表,在给定的阶段中,无论何时调用process.nextTick(),传递给process.nextTick()的所有回调都将在事件循环继续之前解析。
因此,进程.nextTick()回调将在每个事件循环的勾号上执行,而不是在事件循环开始之前执行。
让我用这个简单的程序来演示:
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);
close
3
nextTick
1
timeout
2
immediate
这是输出: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
说明:
- process.nextTick(()=>console.log(“process.nextTick from interval”);将回调放入下一个任务队列(也称为微任务队列)。因此,文本“process.nextTick from interval”打印在第一个文本“interval”之后,但在下一个文本“interval”之前。所有来自microtasks队列的回调都将在事件循环继续到下一阶段之前运行(请参阅官方指南中的上述引用)李>
- 文本“process.nextTick before”和“process.nextTick after”在第一个间隔文本之前打印,因为nextTick队列是在事件循环开始之前处理的。从:
当Node.js启动时,它初始化事件循环,处理提供的输入脚本(或放入REPL,本文档中未涉及),该脚本可能进行异步API调用、调度计时器或调用process.nextTick(),然后开始处理事件循环。
这是程序的输出:
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);
close
3
nextTick
1
timeout
2
immediate
说明:您可以在此处找到有关节点事件循环的简要(16分钟)说明:
官方指南(由@estus提及)是最好的解释:
要获得更深入的解释,请查看这一系列博客帖子:
根据: 您可能已经注意到process.nextTick()没有显示在图表中,即使它是异步API的一部分。这是因为process.nextTick()从技术上讲不是事件循环的一部分。相反,无论事件循环的当前阶段如何,都将在当前操作完成后处理nextTickQueue。
回顾我们的图表,在给定的阶段中,无论何时调用process.nextTick(),传递给process.nextTick()的所有回调都将在事件循环继续之前解析。
因此,进程.nextTick()回调将在每个事件循环的勾号上执行,而不是在事件循环开始之前执行。
让我用这个简单的程序来演示:
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);
close
3
nextTick
1
timeout
2
immediate
这是输出: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
说明:
- process.nextTick(()=>console.log(“process.nextTick from interval”);将回调放入下一个任务队列(也称为微任务队列)。因此,文本“process.nextTick from interval”打印在第一个文本“interval”之后,但在下一个文本“interval”之前。所有来自microtasks队列的回调都将在事件循环继续到下一阶段之前运行(请参阅官方指南中的上述引用)李>
- 文本“process.nextTick before”和“process.nextTick after”在第一个间隔文本之前打印,因为nextTick队列是在事件循环开始之前处理的。从:
当Node.js启动时,它初始化事件循环,处理提供的输入脚本(或放入REPL,本文档中未涉及),该脚本可能进行异步API调用、调度计时器或调用process.nextTick(),然后开始处理事件循环。
这是程序的输出:
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);
close
3
nextTick
1
timeout
2
immediate
说明: