需要使用节点jsasynchronous调用两个apis,并汇总来自apis的响应

我到目前为止写的代码如下。 我不需要整个回应,但只是其中的一部分。

var request = require('request'); var async = require('async'); var asyncTasks = []; var install; async.series([ function (callback) { setTimeout(function () { request('URL', function (error, response, body) { if (!error && response.statusCode == 200) { console.log(body); // Show the HTML for the Google homepage. } }); }, 5000); }, function (callback) { setTimeout(function () { request('URL', function (error, response, body) { if (!error && response.statusCode == 200) { console.log(body); // Show the HTML for the Google homepage. } }); }, 5000); } ], function (error, results) { console.log(results); }); 

同时做上述的一种方法是使用async.parallel – 的forms:

 async.parallel([ function(){ ... }, function(){ ... } ], callback); 

另一种方法是使用Promises库 – BlueBird或Q是很好的select。

问:所有的forms是:

 return Q.all([ promise1, promise2 ]).spread(function (resultFromPromise1, resultFromPromise2) { // do something with the results... 

});

你可以使用这些方法之一来平行两个调用。 每个的输出将给你一个数组,分别包含每个调用的结果

以下是每种方法的简单说明:

使用Async.js

 var async = require('async'); var task = function (cb, count) { setTimeout(function () { cb(null, "complete: " + count); }, 1000); }; async.parallel([ function (cb) { task(cb, 'one'); }, function (cb) { task(cb, 'two'); } ], function (err, results) { console.log(results); //[ 'complete: one', 'complete: two' ] }); 

使用Q

 var Q = require('q'); function task1(cb, count) { var deferred = Q.defer(); setTimeout(function () { return deferred.resolve(cb(null, count)); }, 1000); return deferred.promise; } var myCb = function (err, count) { return "complete: " + count; }; Q.all([task1(myCb, 'one'), task1(myCb, 'two')]) .then(function (results) { console.log(results); //[ 'complete: one', 'complete: two' ] }); 

如果你不清楚,请告诉我。

诺言在这种情况下可以帮助你。 我宁愿使用'Q'库。

我已经修改你的代码来使用Q库

 var Q = require('q'); var request = require('request'); function makeCall() { Q.all([req1(), req2()]) .spread(function (res1, res2) { // This block is executed once all the functions( Provided in Q.all() ) are finished its execution. // Use responses from called functions }, function (err) { // Error, If any }); } function req1() { var defer = Q.defer(); var url = ''; // Specify URL var options = { method: 'get', // Method to use url: url } request(options, function (err, res, body) { if (err) { return defer.reject(err); } return defer.resolve(body); }); return defer.promise; } function req2() { var defer = Q.defer(); var url = ''; // Specify URL var options = { method: 'get', // Method to use url: url } request(options, function (err, res, body) { if (err) { return defer.reject(err); } return defer.resolve(body); }); return defer.promise; } 

你可以在这里findQ库的文档 : Q docs