2015-11-07 26 views
2
function work(){ 
    //do some of the heavy computation now 
    process.nextTick(work); 
} 

work(); 


console.log("started"); 
setTimeout(function(){ console.log("hi there");}, 1000); 

當我運行他的代碼時,我得到:開始,但我從來沒有收到消息。 我做錯了什麼,或者這是節點的問題?Node setoutout notWorking

編輯: 當我更換的setTimeout它的工作原理,但nextTick應該是更快,或者當我process.nextTick取代的setTimeout()你好節目,但它不會等待1000毫秒的process.nextTick。

+1

'work'被無限調用? – Tushar

+0

爲什麼然後console.log(「開始」)叫做 – Coder3000

+0

在'nextTick'之前執行是需要執行的。 – Tushar

回答

1

使用setImmediate是去

function work(){ 
    setImmediate(work); 
} 

work(); 


console.log("started"); 
setTimeout(function(){ console.log("hi there");}, 1000); 
+0

解決方案不錯,只是每臺計算機都有一個不同的maxTick,它並不是每個用戶使用它的最佳選擇。 – Coder3000

+0

也許這 - https://gist.github.com/tkrueger/3500612 - 將幫助 –

+0

或 - setImmediate http://plafer.github.io/2015/09/08/nextTick-vs-setImmediate/ –

0

的Node.js使用事件循環的工作方式,(簡單地說),直到它返回它會運行任何代碼,然後在它的隊列中運行,接下來的事情。 process.nextTick()設置您將它傳遞給該隊列中下一個事物的函數。 setTimeout(foo, x)會告訴它將您傳遞給隊列的功能添加到x毫秒中。

你的代碼是在隊列中添加work爲未來的事情再整理,所以後來節點運行work函數,該函數的東西然後將work在隊列中,接下來的事情,這樣下去,直到永遠。在某個時間點,計時器結束並將您的日誌添加到隊列中,但由於nextTick總是將work作爲隊列中的第一件事物添加,因此它永遠不會實際檢測到它。

+0

然後你可以在最後添加它,而不使用setTimout – Coder3000

相關問題