2013-04-23 52 views
0

對於每個請求可能需要一秒或兩秒鐘的應用程序,是否可能僅在事件循環的每次迭代中處理一段操作代碼? 例如:處理Node.js中的下一個事件

function foo() 
{ 
    ...operative code... 
    ...start processing the next event here... 
    ...continue with foo() here.... 
} 

難道是這樣的?

function foo() 
{ 
    ...operative code... 
    process.nextTick(function() { 
     ...continue with foo() here... 
    }); 
} 

如果這樣做的話,Node是否會自動開始處理隊列中下一個事件?

+0

您的操作代碼是基於IO嗎?通常,當我有一些運行一兩秒鐘的東西時,大部分是IO時間。如果是這種情況,那麼節點將自動處理併發,因爲它的IO模型是非阻塞的。 – tilleryj 2013-04-23 20:24:36

+0

@tilleryj假設它不是基於IO的,是否有辦法跳到下一個事件並稍後回來繼續處理? – alf 2013-04-23 20:26:20

+0

@tilleryj我意識到這需要非IO功能的很多代碼需要一秒多的時間。但我真的只是想了解事件循環是如何工作的,以及我對它有多少控制。 – alf 2013-04-23 20:28:23

回答

1

如果時間花在IO中,節點的非阻塞模型將自動處理併發。

如果它不在IO中使用,那麼您正確使用process.nextTick來推遲代碼的執行,以便其他請求有更改要處理。這裏是一個很好的書面記錄:

http://howtonode.org/understanding-process-next-tick

+0

謝謝。另外,所有節點的IO調用都是順序的嗎?假設我有類似'db.query(query,callback1); db.query(anotherQuery,callback2);'。是否會首先調用callback1? – alf 2013-04-23 21:06:36

+0

否。將按查詢返回的順序調用它們。 – tilleryj 2013-04-23 21:30:32

+0

但是如果兩個調用都涉及寫入磁盤呢?也許這樣的事情會更好地說明我的問題,'file.write(somethingLong,callback1); file.write(somethingShort,callback2);'。在這種情況下,不會回調1總是首先被調用? – alf 2013-04-23 21:37:13

1

你的假設是正確的,你應該將工作分成執行的更小的塊,並與process.nextTick安排下一個塊。所有其他計劃的事件需要在下一個滴答時間執行,將在您的所需執行塊之前處理。