Как использовать параметр параллелизма 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?
Ссылка на документацию находится здесь.
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
});