当您试图理解 Node.js 事件循环时,其中一个重要部分是 process.nextTick()
。
Tips:process 对象是 Node.js 核心 API 提供的少数全局对象之一。它可以从任何地方访问,因此它的方法也可以访问。
在 Node.js 中,每次事件循环执行一次完整的过程,我们称之为 tick。
当我们将函数传递给 process.nextTick()
时,我们指示引擎在当前操作结束时,在下一个事件循环 tick 开始之前调用此函数:
process.nextTick(() => {
// do something ...
})
事件循环正忙于处理当前功能代码。
当此操作结束时,JS 引擎运行该操作期间传递给 nextTick
调用的所有函数。
我们可以通过这种方式告诉 JS 引擎异步处理函数(在当前函数之后),但要尽可能快,而不是让它排队。
这里我们讲一下,浏览器的 setTimeout()
函数,它用于在不久的将来执行延迟任务。
setTimeout(() => {
// do something ...
}, 0)
推荐:详细用法请看 JavaScript 中的 setTimeout 和 setInterval 方法。
先来看一个 🌰:
process.nextTick(() => {
console.log('nextTick')
})
console.log('log')
setTimeout(() => {
console.log('setTimeout')
})
// log
// nextTick
// setTimeout
从上面的代码片段可以看出,nextTick
在 setTimeout
之前先被打印。
setTimeout()
和 process.nextTick()
之间的区别在于 process.nextTick()
函数特定于 Node.js 事件循环。
调用 setTimeout()
将在下一个 tick 结束时执行函数,这比使用 nextTick()
时要晚得多,后者将优先处理调用并在下一 tick 开始前执行。
所以,如果要确保在下一次事件循环迭代中代码已经执行,请使用 nextTick()
。