Как сделать параллельные асинхронные несколько запросов одновременно с Promises в Node
Массив и циклы, но я хочу иметь возможность запускать все из них параллельно, поскольку я не хочу запускать один за другим.
Я в основном хочу сохранить все коды состояния вызовов конечной точки, тело и время в виде массива и вернуть их как результаты, независимо от того, есть ошибки или нет в конечной точке.
Я использую Bluebird, как я могу использовать его функции для решения этой проблемы?
4 ответа
Ты можешь использовать Promise.map
с .bind
:
function getComponentStatuses(componentsToCheck) {
return Promise.map(componentsToCheck, function() {
var start = Date.now();
return getAsync({
url: component.endpoint,
timeout: component.timeout
})
.bind({
name: component.name,
status: null,
body: null,
time: null
})
.spread(function(response, body){
Logger.info('GET took ' + end + 'ms.');
this.status = response.statusCode;
this.body = body;
return this;
})
.catch(function(e) { return this; })
.finally(function() { this.time = Date.now() - start; })
});
}
Обратите внимание, что ваш метод синхронизации неверен, потому что http-агент может регулировать запросы.
Bluebird поддерживает несколько одновременных Обещаний.
См. Ссылку по адресу: https://github.com/petkaantonov/bluebird/blob/master/API.md#promisejoinpromisethenablevalue-promises-function-handler---promise
Есть два способа сделать это:
.all() - хорошо для динамического числа обещаний
.join () - подходит для фиксированного числа обещаний и, что касается документации Bluebird, обеспечивает лучшую производительность, чем метод.all().
Из документации Bluebird:
var Promise = require("bluebird");
var join = Promise.join;
join(getPictures(), getComments(), getTweets(),
function(pictures, comments, tweets) {
console.log("in total: " + pictures.length + comments.length + tweets.length);
});
Я использую q Обещание Может помочь
return q.all([function or value1, function or value 2, ......])
.spread(function (result1, result2, ....) {
// do somethine
})
............