2014-07-14 20 views
13

我正嘗試將藍鳥的地圖功能與內置的併發控制一起使用。如何爲地圖功能使用藍鳥併發選項

我想檢索一個名稱列表,然後爲每個名稱進行一些POST請求。例如,我想爲每週的每一天的每個名稱提出請求。但是,我需要限制併發POST請求的數量,因爲預期的服務器具有速率限制。

function getNames() { 
    //Open mongodb connection 
    //Get collection and array of names 
    //return array of names in a promise 
} 

function createDatesArray() { 
    //Create an array of rates 
    //return array of dates in a promise 
    //Ex. return Promise.resolve(datesArray); 
} 

getNames().map(function (name) { 
    return createDatesArray().map(function (date) { 
     return requestData(date, name); 
    }, {concurrency: 5}); 
}).then(function() { 
//do something 
}); 

這是使用藍鳥的併發性的正確方法嗎?

文檔鏈接在這裏bluebird documentation

回答

13

簡短的回答:,這將請求數量限制爲5

警告:記住,你可能仍然容易受到更多的限制,如HTTP客戶端的,或任何其他池,您可能正在使用的模塊和服務。

此外,Mongo連接意味着用作持久連接,所以您應該只打開一個連接,然後使用它,而不是每次打開和關閉連接。

如果createDatesArray什麼都不做異步的,你不必Promise.resolve它,你可以改用的map靜態變量作爲Promise.map(datesArray, function(date){ ... })等我也不會窩。假設createDatesArray確實是異步的:

Promise.join(getNames(), createDatesArray(), function(names, dates){ 
    var tasks = []; 
    names.forEach(function(name){ // create Cartesian product of names * dates 
     dates.forEach(function(date){ 
      tasks.push(function(){ return requestData(name, date); }); 
     }); 
    }); 
    return Promise.map(tasks, function(job){ return job(); } , { concurrency: 5}); 
}), then(function(results){ 
    // do whatever 
}); 
+0

甜。我在做Promise.using在其他地方的mongo連接。我不知道地圖的靜態變體也採用了併發選項。你的代碼示例是一種非常易讀的方法。 TY。 – aefhm