2016-11-16 68 views
3

下面是存在于“practise01.js”文件中的代码,为什么以及何时使用process.nextTick?

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")); 

从上面的代码运行的输出是

[email protected]:~/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")(); 

运行上述代码后输出是

[email protected]:~/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”。

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

请给我解释一下或者给我一些指点在您的文章

+0

因为您使用*仅*'console.log'或*仅*'process.nextTick'你看不到的差异。做控制台日志,然后打勾,console.log,你会看到不同之处。 – Azamantes

+0

我没有明白。你能否详细说明 –

回答

0

你有你的答案在您与我们分享您的输出:

[email protected]:~/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"));

结果

Next TICK ONE, 
Next TICK TWO, 
Next TICK THREE, 
Next TICK FOUR, 
TIMEOUT AFTER-ONE 
TIMEOUT AFTER-TWO 
TIMEOUT AFTER-THREE 

当您使用process.nextTick基本上你保证,你作为一个参数传递的功能将在未来打勾即马上打电话。下一个事件循环的开始。所以这就是为什么你的计时器之前执行下一个滴答的所有函数。 setTimeout接下来的勾号并不意味着下一秒它意味着nodejs eventloop的下一个循环。另外,下一个滴答声确保您尝试调用的函数是异步执行的。下一个滴答比你的定时器,I/O操作等排队在事件回调中执行更高的优先级。如果要确保代码在下一个事件循环开始时执行,而不是在指定时间后执行,则应该使用nextTick。 nextTick比定时器更高效,并且您希望确保您调用的函数是异步执行的。您可以在的NodeJS docs

+0

这是我的第5篇文章,试图了解下一个滴答声,说'会立即在下一个滴答声中被调用,即。下一个事件循环的开始。但是我没有看到一个循环。你能否指定所谓的“事件循环”在哪里? –

1

找到更多这方面的信息节点文件实际上是在解释的时候,为什么使用不错nextTick:

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

作用:

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

以及何时使用:

此开发的API,以便给用户一个对象已建成之后,但任何我前/ 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() 
相关问题