How to do parallel async multiple requests at once with Promises in Node

后端 未结 4 735
Happy的楠姐
Happy的楠姐 2021-01-13 15:44

Array and loops through but I want to be able to run all of them in parallel instead as I don\'t want to run one after another.

I basically want to store all endpoin

相关标签:
4条回答
  • 2021-01-13 15:51

    You can use Promise.map with .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; })
        });
    }
    

    Note that your timing method is incorrect because the http agent might throttle requests.

    0 讨论(0)
  • 2021-01-13 15:56

    Found the solution.

    Use .settle

    0 讨论(0)
  • 2021-01-13 16:01

    Bluebird supports multiple concurrent Promises.

    See the reference at: https://github.com/petkaantonov/bluebird/blob/master/API.md#promisejoinpromisethenablevalue-promises-function-handler---promise

    There are two ways to do it:

    .all() - good for a dynamic number of promises

    .join() - good for a fixed number of promises and as for Bluebird's documentation, it supplies a better performance than .all() method.

    From bluebird's documentation:

     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);
    });
    
    0 讨论(0)
  • 2021-01-13 16:12

    I use q Promise Maybe help

    return q.all([function or value1, function or value 2, ......])
    .spread(function (result1, result2, ....) {
       // do somethine
    })
    

    ............

    0 讨论(0)
提交回复
热议问题