如何将bluebird并发选项用于map函数

时间:2014-07-14 20:32:08

标签: concurrency promise bluebird

我正在尝试使用bluebird的map函数和内置的并发控件。

我想检索一个名称列表,然后为每个名称发出一些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并发的正确方法吗?

文档链接在bluebird documentation

1 个答案:

答案 0 :(得分:15)

简短回答:,这会将请求数限制为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
});