如何使用 Node 中的 Promises 同时执行并行异步多个请求
How to do parallel async multiple requests at once with Promises in Node
排列并循环,但我希望能够 运行 并行处理所有这些,因为我不想一个接一个 运行。
我基本上想将所有端点调用状态代码、正文和时间存储为数组,并将它们 return 作为结果,无论端点中是否存在错误。
我正在使用 Bluebird,如何使用它的功能来解决这个问题?
我使用 q Promise
也许有帮助
return q.all([function or value1, function or value 2, ......])
.spread(function (result1, result2, ....) {
// do somethine
})
.......
Bluebird 支持多个并发 Promise。
有两种方法:
.all() - 适用于动态数量的承诺
.join() - 适用于固定数量的承诺,对于 Bluebird 的文档,它提供了比 .all() 方法更好的性能。
来自蓝鸟的文档:
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);
});
找到解决方案。
使用.settle
您可以将 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 代理可能会限制请求。
排列并循环,但我希望能够 运行 并行处理所有这些,因为我不想一个接一个 运行。
我基本上想将所有端点调用状态代码、正文和时间存储为数组,并将它们 return 作为结果,无论端点中是否存在错误。
我正在使用 Bluebird,如何使用它的功能来解决这个问题?
我使用 q Promise 也许有帮助
return q.all([function or value1, function or value 2, ......])
.spread(function (result1, result2, ....) {
// do somethine
})
.......
Bluebird 支持多个并发 Promise。
有两种方法:
.all() - 适用于动态数量的承诺
.join() - 适用于固定数量的承诺,对于 Bluebird 的文档,它提供了比 .all() 方法更好的性能。
来自蓝鸟的文档:
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);
});
找到解决方案。
使用.settle
您可以将 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 代理可能会限制请求。