2011-05-21 242 views
0

我已經做Nodejs: How to write high performance async loop爲stormjs,您可以檢查stormjs serial loop demo的NodeJS:並行請求,串行響應

但仍然有問題並行循環,例如我們有一個功能requestContext(index, callback(err, context))其遠程獲取上下文「http://host/post/ {指數}」,我們需要得到的[0-99]的背景下,推動背景下進入該命令的數組,[context0...context99]

但很明顯,這個輸出着工作stormjs parallel loop

我仍然想知道節點是如何完成這個任務的,但是你必須使這些請求並行,而不是一個一個地執行,它應該是並行請求和串行推送。

+0

一個數組?你爲什麼不直接寫風暴呢? – Raynos 2011-05-21 18:35:45

+0

我不會爲此使用風暴,我正在爲此創建風暴。我必須確保暴風雨得到了這種情況下的最佳代碼,也是類似的情況。問題是如何做到這一點沒有stormjs。 – 2011-05-22 02:54:29

回答

1
var counter = 0; 
// create an array with numbers 0 to 99. 

_.range(0,100).forEach(function(key, value, arr) { 
    // for each of them request context 
    requestContext(key, function(err, context) { 
     // add the context to the array under the correct key 
     if (!err) { 
      arr[key] = context; 
     } 
     // increment counter, if all have finished then fire finished. 
     if (++counter === 100) { 
      finished(arr); 
     } 
    }); 
}); 

function finished(results) { 
    // do stuff 
} 

無需風暴。如果你想要一個執行/流量控制庫,我會建議Futures,因爲它不會編譯你的代碼並「隱藏魔法」。

此前,您通過每一個遞歸執行它們並按順序將它們按順序推入到數組中。

這次你並行執行它們,並告訴每一個將數組中正確的有序鍵賦值給它們自己的值。

_.range創建一個包含值0到爲什麼要使用風暴這個99

+0

謝謝。爲什麼以前的序列和這個並行,因爲代碼說。下一個循環是否依賴於前一個循環,將決定串行還是並行。 – 2011-05-22 03:03:14

+0

@guillin您的上一個示例中的每個請求都會返回下一個請求所需的「url」。這一次你前面有100個網站,所以你可以並行地發射它們。 – Raynos 2011-05-22 12:41:58