2014-03-07 26 views
1

使用JavaScript(節點,但瀏覽器中存在相同問題),我有一個用戶列表。必須使用每個用戶對象登錄到交易所以檢索其訂單,然後(如果有)找到,處理它們。一旦登錄到交易所,就會建立一個循環,以便定期檢索所有用戶的所有交易所的訂單,直到該過程終止。node.js異步在循環和處理對象數組時丟失上下文

例如爲:

var users = [ { id:1, throttle: 20 }, { id: 2, throttle: 45 } ]; 
var exchanges = [ 'au', 'uk' ]; 

將意味着4個迴路與後續的設置運行::

processor 1 - id: 1, exchange 'au', throttle: 20 
processor 2 - id: 1, exchange 'uk', throttle: 20 
processor 3 - id: 2, exchange 'au', throttle: 45 
processor 4 - id: 2, exchange 'uk', throttle: 45 

對於每一種情況下,我每圈x分鐘(根據油門)。

我一直在使用caolan的異步庫來做到這一點 - 特別是async.each,async.forever和async.parallel函數;但我正在努力在他們之間傳遞範圍。

問題是用戶在第一次通過時會分配交換(例如'au')並且運行良好。在任何後續的循環中,該函數會選擇一個不同的用戶來應用它。

我創建了一個小提琴來演示這個問題:http://jsfiddle.net/RnMb9/7/

第一遍後(用戶1:加工AU交換(每20秒))「AU」是從來沒有出現過。

關於如何糾正此上下文問題的任何想法?我一直在玩弄所有領域的用戶,但無濟於事。

+0

請在問題中發佈您的代碼。 – Bergi

+0

對於「開始關閉」,您想要一個同步循環 - 不要使用帶有回調函數的'async.each',而是使用普通的'_.each' – Bergi

回答

0
….each(users, function(user) { 
    ….each(exchanges, function(exchange) { 
     … 
     user.exchange = exchange; 

那是你的問題。在每個(內部)循環中,您將覆蓋同一user對象的.exchange值。爲了解決這個問題,您可以使用clone這個對象,或者讓交換器成爲處理器的一個單獨的參數,而不是將其作爲用戶對象的一部分傳遞給處理器。