了解 setImmediate()
Node.js setImmediate 函数以一种特殊的方式与事件循环交互。
当你想异步执行一段代码,但尽可能快地执行时,一个选择是使用 Node.js 提供的 setImmediate()
函数:
作为 setImmediate() 参数传递的任何函数都是在事件循环的下一次迭代中执行的回调。
setImmediate()
与 setTimeout(() => {}, 0)
(传递 0 毫秒超时)以及 process.nextTick()
和 Promise.then()
有何不同?
在当前操作结束后,传递给 process.nextTick()
的函数将在事件循环的当前迭代中执行。 这意味着它将始终在 setTimeout
和 setImmediate
之前执行。
延迟为 0 毫秒的 setTimeout()
回调与 setImmediate()
非常相似。 执行顺序将取决于各种因素,但它们都将在事件循环的下一次迭代中运行。
process.nextTick
回调添加到 process.nextTick queue
。 Promise.then()
回调添加到 promises microtask queue
。 macrotask queue
添加了 setTimeout
、setImmediate
回调。
事件循环先执行 process.nextTick queue
中的任务,然后执行 promises microtask queue
,再执行 macrotask queue
。
以下是显示 setImmediate()
、process.nextTick()
和 Promise.then()
之间顺序的示例:
此代码将首先调用 start()
,然后在 process.nextTick queue
中调用 foo()
。 之后,它将处理 promises microtask queue
,它打印 bar
,同时在 process.nextTick queue
中添加 zoo()
。 然后它将调用刚刚添加的 zoo()
。 最后调用了 macrotask queue
中的 baz()
。