Как использовать параметр параллелизма bluebird для функции карты

Я пытаюсь использовать функцию карты bluebird со встроенным контролем параллелизма.

Я хочу получить список имен, а затем сделать несколько запросов 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.


person aefhm    schedule 14.07.2014    source источник


Ответы (1)


Краткий ответ: да , это ограничит количество запросов до 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
});
person Benjamin Gruenbaum    schedule 14.07.2014
comment
Сладкий. Я делал Promise.using на соединении монго в другом месте. Я не знал, что статический вариант карты также использует параметр параллелизма. Ваш пример кода - очень читаемый подход. ТЫ. - person aefhm; 15.07.2014