简单的回答:
setImmediate
在下一个刻度上运行。
细节:
setImmediate
并且setTimeout
都在事件循环的不同阶段运行。
这就是为什么当setTimeout
设置为零延迟时它不会立即运行。使用 setImmediate 它总是在事件循环的下一个滴答声中运行。
但
process.nextTick
基本上不关心事件循环的阶段。您分配给此方法的回调将在当前操作完成后和事件循环继续之前执行。
您链接的文档对差异有很好的解释。我将在这里吸引您的注意力。在setimmediate-vs-settimeout中,调用顺序是不确定的,除非它们被安排在 I/O 周期内,如下例所示。
现在添加process.nextTick
到示例中
const fs = require('fs');
// I/O cycle
fs.readFile(__filename, () => {
setTimeout(() => {
console.log('timeout');
}, 0);
setImmediate(() => {
console.log('immediate');
});
});
process.nextTick(() => {
console.log('nextTick')
})
输出:
nextTick
immediate
timeout
如果您运行上面的代码,process.nextTick
函数中的任何内容都将首先执行。原因是,它在事件循环继续之前运行。请记住,两者都setTimeout
与setImmediate
事件循环相关,但与 process.nextTick 无关。
要非常小心你如何使用process.nextTick
. 如果你没有正确使用它,你最终可能会陷入糟糕的境地。