NodeJS - 发送多个请求并在一个回调中处理所有响应

时间:2016-06-02 10:02:46

标签: node.js express asynchronous

我正在尝试找到一种方法来发送多个请求(使用Express)并在一个函数中处理所有响应。

这是我的代码:

  // In router.js
  app.get('/api/FIRST_PATH', CALLBACK_FUNCTION_A );

 // In CALLBACK_FUNCTION_A file :
 module.exports = function (req, response) {
   CALLBACK_FUNCTION_TO_SERVICE_A();
   CALLBACK_FUNCTION_TO_SERVICE_B();
   CALLBACK_FUNCTION_TO_SERVICE_C();
}

我的问题是发送请求CALLBACK_FUNCTION_TO_SERVICE_A,CALLBACK_FUNCTION_TO_SERVICE_B和CALLBACK_FUNCTION_TO_SERVICE_C,然后检索另一个函数中的所有结果来处理它们。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

您可以了解有关新js标准的更多信息,并使用Promise

// In CALLBACK_FUNCTION_A file :
module.exports = function (req, response) {
   var promises = [CALLBACK_FUNCTION_TO_SERVICE_A(), 
      CALLBACK_FUNCTION_TO_SERVICE_B(),
      CALLBACK_FUNCTION_TO_SERVICE_C()];

   Promise.all(promises).then( function(results) {
       //results is an array
       //results[0] contains the result of A, and so on
   });
}

当然CALLBACK_FUNCTION_TO_SERVICE_A()并且需要返回Promise个对象。你形成了这样一个函数:

function asyncFunction(callback) {
   //...
   callback(result);
}

你可以像这样创建一个Promise:

var p = new Promise(asyncFunction);

它将开始运行该函数,并支持Promise接口。

例如,要么使用request-promise,要么可以执行以下操作:

function CALLBACK_FUNCTION_TO_SERVICE_A() {
   var worker = function(callback) {
       app.get('/api/FIRST_PATH', callback);
   };

   return new Promise(worker);
}

您可以详细了解Promise以及如何轻松处理错误。

答案 1 :(得分:1)

您可以使用async parallel。您可以将所有API调用保留为async.parallel数组或JSON(示例使用数组)。

async.parallel(
 [
    function(done){
      reqServcieA(..., funnction(err, response){
        if(err) done(err,null);
        done(null, response);
      }
    },
    function(done){
      reqServcieA(..., funnction(err, response){
        if(err) done(err,null);
        done(null, response);
      }
    },
    ...// You can keep as many request inside the array

 ], function(err,results){
   // Will be called when all requests are returned
   //results is an array which will contain all responses as in request arry
    //results[0] will have response from requestA and so on
 });