数组和循环,但我希望能够并行运行所有这些,因为我不想一个接一个地运行。
我基本上希望将所有端点调用状态代码,正文和时间存储为数组,并将它们作为结果返回,无论端点中是否存在错误。
我正在使用Bluebird,我如何使用它的功能来解决这个问题?
答案 0 :(得分:5)
您可以将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代理可能会限制请求。
答案 1 :(得分:4)
Bluebird支持多个并发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);
});
答案 2 :(得分:0)
找到了解决方案。
使用.settle
答案 3 :(得分:-1)
我使用q Promise 也许帮助
return q.all([function or value1, function or value 2, ......])
.spread(function (result1, result2, ....) {
// do somethine
})
............