How to run multiple async functions then execute callback

后端 未结 3 813
甜味超标
甜味超标 2020-12-05 10:16

In my NodeJS code I need to make 2 or 3 API calls, and each will return some data. After all API calls are complete I want to collect all the data into a single JSON object

3条回答
  •  一个人的身影
    2020-12-05 10:26

    Promises give you Promise.all() (this is true for native promises as well as library ones like bluebird's).

    Update: Since Node 8, you can use util.promisify() like you would with Bluebird's .promisify()

    var requestAsync = util.promisify(request); // const util = require('util')
    var urls = ['url1', 'url2'];
    Promise.all(urls.map(requestAsync)).then(allData => {
        // All data available here in the order of the elements in the array
    });
    

    So what you can do (native):

    function requestAsync(url) {
        return new Promise(function(resolve, reject) {
            request(url, function(err, res, body) {
                if (err) { return reject(err); }
                return resolve([res, body]);
            });
        });
    }
    Promise.all([requestAsync('url1'), requestAsync('url2')])
        .then(function(allData) {
            // All data available here in the order it was called.
        });
    

    If you have bluebird, this is even simpler:

    var requestAsync = Promise.promisify(request);
    var urls = ['url1', 'url2'];
    Promise.all(urls.map(requestAsync)).then(allData => {
        // All data available here in the order of the elements in the array
    });
    

提交回复
热议问题