setImmediate与nextTick

Node.js版本0.10已于今天发布并引入 setImmediateAPI的变化文档建议做递归时使用它nextTick调用。

MDN所说的来看,它与process.nextTick

什么nextTick时候应该使用setImmediate?什么时候应该使用

LSam2020/03/18 16:52:37

我建议您查看专用于Loop的文档部分,以更好地理解。从那里摘录的一些片段:

就用户而言,我们有两个呼叫类似,但是它们的名称令人困惑。

  • process.nextTick()在同一阶段立即触发

  • setImmediate()在
    事件循环的以下迭代或“滴答”中触发

本质上,名称应互换。process.nextTick()比setImmediate()触发得更快,但这是过去的产物,不太可能改变。

达蒙前端2020/03/18 16:52:37

简单来说,process.NextTick()将在事件循环的下一个计时执行。但是,setImmediate本质上具有一个单独的阶段,该阶段确保仅在IO回调和轮询阶段之后才调用在setImmediate()下注册的回调。

请参考此链接以获得更好的解释:https : //medium.com/the-node-js-collection/what-you-should-know-to-really-understand-the-node-js-event-loop-and -its-metrics-c4907b19da4c

简化的事件循环事件

Tom梅Green2020/03/18 16:52:37

在答案中的注释中,没有明确指出nextTick从Macrosemantics转变为Microsemantics。

在节点0.9之前(引入setImmediate时),nextTick在下一个调用堆栈的开始处运行。

从0.9节点开始,nextTick在现有调用栈的末尾运行,而setImmediate在下一个调用栈的末尾运行

查看https://github.com/YuzuJS/setImmediate以获取工具和详细信息

2020/03/18 16:52:37

setImmediate如果要将函数放在事件队列中已经存在的任何I / O事件回调后面,请使用此函数。用于process.nextTick将函数有效地放在事件队列的开头,以便在当前函数完成后立即执行。

因此,在您尝试使用递归分解长时间运行且受CPU限制的作业的情况下,您现在想使用setImmediate而不是process.nextTick将下一个迭代放入队列中,因为否则任何I / O事件回调都不会获得机会在迭代之间运行。