2012-08-09 93 views
3

Node.js的方法是事件驅動的,我想知道你將如何解決何時發生事件的問題?如何開發node.js運行時策略?

比方說,我們有一個Web應用程序的一些操作:創建一些數據,服務頁面,

你會如何鋪陳這些事件的接收數據等?在一個螺紋系統中,設計相當「簡單」。您將線程專用於特定的一組任務,並沿着線程同步的方向前進。儘管這些任務處於低需求狀態,但線程卻處於空閒狀態,什麼也不做。當他們需要時,他們運行他們的代碼。雖然這條道路存在問題,但它有很好的文件記錄和解決方法。

我發現很難繞過node.js事件處理方式。 我有10個請求進來,但我沒有創建任何數據,所以我不能任何服務,創建數據是一個長期的行動,另外5個客戶端想發送數據。現在怎麼辦?

UPDATE: 在試圖環繞這個問題我已經創建了下面的代碼我的頭,這是未經測試卻又如此裸露與我在這裏。該代碼基本上是一堆回調,它們被註冊並且應該被執行。將會有某種樁管理器可以運行並決定現在要執行的代碼。該回調創建的所有回調都可以「自然」添加到偶數循環中。它也應該註冊它自己,所以事件循環可以將控制權交還給它。其他內容如靜態內容和可以以不同方式綁定的內容。

  1. 如何在當前事件循環狀態下注冊回調爲最後一個回調?
  2. 這是解決此問題的好方法嗎?

正確答案:

選擇的答案是最正確的,只有一個小的代碼變化,那就是:

變化從這個這個功能:

getDetail : function (id, callback) { 
    var data = makeMyData(id); 
    callback(data) 
} 

至:

getDetail : function (id, callback) { 
    var data = makeMyData(id); 
    setTimeout(callback,0,data); 
} 

回答

3

來自線程化環境的最重要的事情是,在節點中,您不必等待某個操作完成,而是告訴它在完成操作時該做什麼。爲此,您使用回調函數,這是一個包含要執行的函數的變量,或者如果您願意,可以使用指向函數的指針。

例如:

app.get('/details/:id?', function (req, res) { 
    var id = req.params.ucid, 
     publish = function (data) { 
      res.send(data); 
     }; 
    service.getDetails(id, publish); 
}); 

然後,您可以調用,一旦你已經創建了所需的數據您的獲取詳細信息的方法內發佈方法。

getDetail : function (id, callback) { 
    var data = makeMyData(id); 
    callback(data) 
} 

然後,它會將您的數據發佈迴響應對象。由於事件循環節點將繼續向這個URL提供請求而不會中斷第一個請求的數據生成

+0

因此,因爲您註冊了一個回調函數,並且不從函數返回值,所以實際上讓事件循環處理它?不回調(數據)現場計算? – qballer 2012-08-09 14:15:03

+0

你是正確的回調(數據)會被當場調用,這是我害怕的一個壞例子。如果您正在執行冗長的I/O操作,則最好使用事件發射器。一旦I/O或數據生成操作完成,它就會發出一個完整的事件,其中可以包含填充數據的回調。 有關事件發射器的更多信息,請參閱[鏈接](http://nodejs.org/api/events.html) – 2012-08-09 15:10:41

+0

您可以隨時重構您的答案。 – qballer 2012-08-09 15:18:26