为什么以及何时使用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()