为什么以及何时使用process.nextTick?

下面是“practise01.js”文件中的代码,

function fn(name){ return f; function f(){ var n = name; console.log("Next TICK "+n+", "); } } function myTimeout(time,msg){ setTimeout(function(){ console.log("TIMEOUT "+msg); },time); } process.nextTick(fn("ONE")); myTimeout(500,"AFTER-ONE"); process.nextTick(fn("TWO")); myTimeout(500,"AFTER-TWO"); process.nextTick(fn("THREE")); myTimeout(500,"AFTER-THREE"); process.nextTick(fn("FOUR")); 

运行上面的代码的输出是

 rahul@rahul:~/myPractise/PlainNodeJSPractise01/Process$ node practise01.js Next TICK ONE, Next TICK TWO, Next TICK THREE, Next TICK FOUR, TIMEOUT AFTER-ONE TIMEOUT AFTER-TWO TIMEOUT AFTER-THREE 

现在我编写了代码,而不使用process.nextTick,在“practise02.js”中,如下所示,

 function myTimeout(time,msg){ setTimeout(function(){ console.log("TIMEOUT "+msg); },time); } function fn(name){ return f; function f(){ var n = name; console.log("Next TICK "+n+", "); } } fn("ONE")(); myTimeout(500,"AFTER-ONE"); fn("TWO")(); myTimeout(500,"AFTER-TWO"); fn("THREE")(); myTimeout(500,"AFTER-THREE"); fn("FOUR")(); 

运行上面的代码后输出

 rahul@rahul:~/myPractise/PlainNodeJSPractise01/Process$ node practise02.js Next TICK ONE, Next TICK TWO, Next TICK THREE, Next TICK FOUR, TIMEOUT AFTER-ONE TIMEOUT AFTER-TWO TIMEOUT AFTER-THREE 

如果你看到两个输出是相同的。

那么在这种情况下,我需要去process.nextTick?

当我试图阅读更多,我明白了如果我需要立即执行一些函数,当事件回滚是空的比去“process.nextTick”。

那么它与我的第二种方法有什么不同?

请解释我或给我一些指点

你在你的post中有你的答案,在那里你与我们分享你的输出:

 rahul@rahul:~/myPractise/PlainNodeJSPractise01/Process$ node practise02.js Next TICK ONE, Next TICK TWO, Next TICK THREE, Next TICK FOUR, TIMEOUT AFTER-ONE TIMEOUT AFTER-TWO TIMEOUT AFTER-THRE 

如果我们将超时间隔从500更改为0,仍然会得到相同的结果:

 function fn(name){ return f; function f(){ var n = name; console.log("Next TICK "+n+", "); } } function myTimeout(time,msg){ setTimeout(function(){ console.log("TIMEOUT "+msg); },time); } process.nextTick(fn("ONE")); myTimeout(0,"AFTER-ONE");// set timeout to execute in 0 seconds for all process.nextTick(fn("TWO")); myTimeout(0,"AFTER-TWO"); process.nextTick(fn("THREE")); myTimeout(0,"AFTER-THREE"); process.nextTick(fn("FOUR")); 

节点文档实际上在解释何时以及为什么使用nextTick方面非常好:

https://nodejs.org/api/process.html#process_process_nexttick_callback_args

它能做什么:

这不是setTimeout(fn,0)的简单别名,它更有效率。 它在任何其他I / O事件(包括定时器)在事件循环的随后滴答中触发之前运行。

何时使用:

在开发API时,这非常重要,以便在用户有机会在构build对象之后但在发生任何I / O之前分配事件处理程序。

 function definitelyAsync(arg, cb) { if (arg) { process.nextTick(cb); return; } fs.stat('file', cb); } definitelyAsync(true, () => { foo(); }); bar(); // will now allways be called before foo()