2011-11-13 63 views
54

我看過process.nextTick在幾個地方使用,不能完全說明它被用於什麼。什麼是Node.js中process.nextTick的正確用例?

什麼是Node.js的的process.nextTick主/正確使用的情況下?該文檔基本上說這是一個更優化的方式做setTimeout,但這並沒有多大幫助。

我以前做了很多ActionScript,所以「等到下一幀」執行代碼的想法在某種程度上是合理的 - 如果你運行的是動畫,你可以讓它更新每一幀而不是每一幀以毫秒爲例。當您想要協調設置一堆變量時,這也很有意義 - 您可以更改第1幀中的變量,並在第2幀中應用更改.Flex在其組件生命週期中實現了類似的功能。

我的問題是,我應該在服務器端JavaScript中使用它?我沒有看到任何需要這種精細調整的性能/流量控制的地方。只是在正確的方向尋找一個點。

+2

Howtonode有一篇關於理解'process.nextTick()'](http://howtonode.org/understanding-process-next-tick)的優秀文章。 –

回答

67

process.nextTick將回調放入隊列中。此隊列中的每個回調將在事件循環的下一個節拍開始時執行。它基本上用作清除呼叫堆棧的一種方式。當文檔說它就像setTimeout,這意味着它就像在瀏覽器中使用setTimeout(function() { ... }, 1)一樣。它具有相同的用例。

一個示例用例是,您爲某個需要事件綁定的對象創建一個構造函數。但是,您無法立即開始發佈事件,因爲實例化它的代碼還沒有時間綁定到事件。你的構造函數調用在調用堆棧上方,如果你繼續做同步的事情,它會保持這種狀態。在這種情況下,您可以先使用process.nextTick,然後繼續執行您要做的任何事情。它保證使用你的構造函數的人將有足夠的時間來綁定事件。

例子:

var MyConstructor = function() { 
    ... 
    process.nextTick(function() { 
    self._continue(); 
    }); 
}; 

MyConstructor.prototype.__proto__ = EventEmitter.prototype; 

MyConstructor.prototype._continue = function() { 
    // without the process.nextTick 
    // these events would be emitted immediately 
    // with no listeners. they would be lost. 
    this.emit('data', 'hello'); 
    this.emit('data', 'world'); 
    this.emit('end'); 
}; 

例中間件使用此構造

function(req, res, next) { 
    var c = new MyConstructor(...); 
    c.on('data', function(data) { 
    console.log(data); 
    }); 
    c.on('end', next); 
} 
+0

謝謝大家,這說得很清楚。 –

+1

另外,setTimeout太慢了。 – Parris

+3

「此隊列中的每個回調都將在事件循環的下一個記號的開頭執行。」我認爲這不完全準確。據我瞭解,隊列在當前刻度的末尾處理。 「在v0.10中,nextTick處理程序在每次從C++調用JavaScript之後運行,這意味着,如果JavaScript代碼調用process.nextTick,那麼只要代碼運行完成,回調就會觸發,但在返回之前到事件循環。「 - 來自[節點0.10.0公告](http://blog.nodejs.org/2013/03/11/node-v0-10-0-stable/) –

15

它只是把你的函數在事件循環的結束。通常當你進行一些繁重的同步處理時,最好對每個代碼塊使用process.nextTick,以確保該進程不會阻塞其他事件。當你這樣做時,在它到達proess.nextTick並且函數結束之後,它會處理其他事件,例如http請求,然後到達process.nextTick回調並執行它。

除此之外,如果你可以使用它來遞歸運行一個函數,而不會導致調用堆棧溢出!

編輯:現在有node's setImmediate function該日程安排的待處理的I/O事件(如處理新的Web請求)後運行的函數:我解釋了一個use case in the answer of this question

相關問題