2016-11-16 89 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() 
相關問題