8

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

我需要对几个 REST API 进行多次调用,收集所有结果,对它们进行处理并将完整的 JSON 返回给客户端(HTML5 + AJAX)。

  1. 调用 API A
  2. 调用 API B
  3. 再次调用 API A(来自 B 的结果)
  4. 将 3 次调用的结果处理为 JSON
  5. response.send(结果)

我确定/希望有一个简单的模式、解决方案或模块,我只是没有正确地用谷歌搜索:) 我也希望对在哪里放置这些操作(在“路线”下?单独的文件? ETC。)

谢谢你的时间!

4

2 回答 2

8

异步模块适合这种工作。具体来说,您可以使用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。它将根据功能的要求确定运行功能的最佳顺序。

于 2012-09-10T06:02:27.747 回答
2

周围有很多控制流库。我在以前的项目中使用过 Q,对此我没有任何抱怨,但是我可能会考虑在我的下一个项目中使用 caolan 的异步库。

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

于 2012-09-10T06:04:41.263 回答