如何使用 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。

参见参考资料:https://github.com/petkaantonov/bluebird/blob/master/API.md#promisejoinpromisethenablevalue-promises-function-handler---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 代理可能会限制请求。