异步调用Node.js中的API模式

时间:2012-09-10 05:05:38

标签: node.js asynchronous express

构建我的第一个“严肃的”Node.js项目(使用Express)。

我需要使用多个REST API调用,收集所有结果,按摩它们并将完整的JSON返回给客户端(HTML5 + AJAX)。

  1. 致电API A
  2. 致电API B
  3. 再次调用API A(来自B的结果)
  4. 将3次调用的处理结果转换为JSON
  5. response.send(结果)
  6. 我确信/希望有一个简单的模式,解决方案或模块,我只是没有谷歌正确:) 我还希望得到关于在何处进行此类操作的意见(在“路线”下?单独的文件等等)

    谢谢你的时间!

2 个答案:

答案 0 :(得分:8)

async模块适用于此类工作。具体来说,您可以使用async.waterfall功能。

示例:

async.waterfall([
    function(callback){
        callback(null, 'one', 'two');
    },
    function(arg1, arg2, callback){
        callback(null, 'three');
    },
    function(arg1, callback){
        // arg1 now equals 'three'
        callback(null, 'done');
    }
], function (err, result) {
   // result now equals 'done'    
});

编辑,如果您在作业之间有一些非常重要的依赖关系,那么您可以使用async.auto。它将根据需要确定运行函数的最佳顺序。

答案 1 :(得分:2)

周围有很多控制流程库。我在以前的项目中使用了Q,我没有抱怨,但是我可能会考虑使用caolan的async库来完成我的下一个项目。

https://github.com/caolan/async

根据您的描述,您可能希望查看使用并行功能

https://github.com/caolan/async#parallel

您描述的问题可以很容易地转移到文档中的并行示例

编辑:我错过了关于API调用的依赖。每当你需要传递链中的值并控制你需要使用瀑布方法的顺序时(参见qiao的答案)。如果存在调用独立的情况,则使用并行方法。并行方法的一个例子如下

async.parallel({
    google: function(callback){
      http.get("http://www.google.com", function(res){
        console.log("google done");
        callback(null, res.statusCode);
      })
    },
    yahoo: function(callback){
      http.get("http://www.yahoo.com", function(res){
        console.log("yahoo done");
        callback(null, res.statusCode);
      })    
    }
  },
  function(err, results) {
    if(!err){
      console.log("all done");
      console.log(results.google);
      console.log(results.yahoo);
    }else{
      console.log(err);
    }
  }
);

这样做可以并行处理所有请求,并在完成所有操作后为您提供回调。这是您按摩数据的地方。

控制流程库列表:

https://github.com/joyent/node/wiki/Modules#wiki-async-flow