process.nextTick() 和 setImmediate() 方法之间的区别
要了解 process.nextTick() 和 setImmediate() 方法之间的区别,我们首先需要了解 Node.js事件循环的工作原理。
什么是 Node.js 事件循环?
由于 JavaScript 是单线程的,即一次只执行一个进程,所以正是 Event Loop 允许 Node.js 执行非阻塞 I/O 操作。
事件循环的工作?
在 JavaScript 程序开始时,会初始化一个事件循环。有几个操作在事件循环中执行。以下是在事件循环的单次迭代中执行不同的顺序。这些操作在队列中处理。
timers–>pending callbacks–>idle,prepare–>connections(poll,data,etc)–>check–>close callbacks
理解 process.nextTick() 方法:每当初始化一个新的操作队列时,我们都可以将其视为一个新的tick 。 process.nextTick() 方法将回调函数添加到下一个事件队列的开头。需要注意的是,在程序开始时,在处理事件循环之前第一次调用 process.nextTick() 方法。
句法:
process.nextTick(callback);
理解 setImmdeiate() 方法:每当我们调用 setImmediate() 方法时,它的回调函数都会被放到下一个事件队列的检查阶段。这里有一点需要注意的是 setImmediate() 方法是在poll阶段调用的,它的回调函数是在check阶段调用的。
句法:
setImmediate(callback);
例子:
setImmediate(function A() {
console.log("1st immediate");
});
setImmediate(function B() {
console.log("2nd immediate");
});
process.nextTick(function C() {
console.log("1st process");
});
process.nextTick(function D() {
console.log("2nd process");
});
// First event queue ends here
console.log("program started");
对于上述程序,事件队列的初始化方式如下:
- 在第一个事件队列中,仅“打印程序启动”。
- 然后启动第二个事件队列,并将函数C 即 process.nextTick() 方法的回调放置在事件队列的开头。 C 被执行,队列结束。
- 然后前一个事件队列结束,第三个事件队列用回调 D 初始化。然后将 setImmdeiate() 方法的回调函数A 放在后面的 B 中。
现在,第三个事件队列看起来像这样,D A B
现在函数 D、A、B 按照它们在队列中出现的顺序执行。
输出:
让我们以表格形式查看差异 - : Its syntax is -: process.nextTick(callback); Its syntax is -: setImmediate(callback);process.nextTick() setImmediate() 1. process.nextTick() is used to schedule a callback function to be invoked in the next iteration of the Event Loop. setImmediate() method is used to execute a function right after the current event loop finishes. 2. Its benefit is that it has no time bound to take a callback. setImmediate() method is only processed on the check handler phase of the event loop 3. process.nextTick() function is specific to the Node.js Event Loop It is generally found in the Timers module 4. 5. It has a benefit that it has the potential to cause I/O starvation Its return value is a unique timer identifier that can be used in another function call.