javascript – 如何运行多个异步函数然后执行回调

在我的NodeJS代码中,我需要进行2或3次API调用,每次调用都会返回一些数据。完成所有API调用后,我想将所有数据收集到一个JSON对象中以发送到前端。

我知道如何使用API​​回调(下一次调用将在前一次调用的回调中发生),但这会很慢:

//1st request
request('http://www.example.com', function (err1, res1, body) {

  //2nd request
  request('http://www.example2.com', function (err2, res2, body2) {

    //combine data and do something with it

  });

});

我知道你也可以做类似的事情并且更符合承诺,但我认为同样的概念适用于下一个调用在当前调用完成之前不会执行的情况。

有没有办法同时调用所有函数,但是我的最后一段代码是等待所有API调用完成并在执行之前提供数据?

最佳答案
Promise为您提供Promise.all()(对于原生承诺以及像bluebird这样的库,这是正确的)。

所以你可以做什么(本机):

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.
    });

如果你有蓝鸟,这甚至更简单:

var requestAsync = 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
});

转载注明原文:javascript – 如何运行多个异步函数然后执行回调 - 代码日志