asynchronous在Node.js中调用模式到API

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

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

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

我敢肯定/希望有一个简单的模式,或解决scheme,或模块,我只是没有正确的谷歌:)我也将不胜感激意见放在这样的操作(在'路线'?分开的文件?等等。)

谢谢你的时间!

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

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

https://github.com/caolan/async

从你上面描述的,你可能会想看看使用并行function

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

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

编辑:我错过了关于API调用依赖的位。 无论何时你需要沿着链传递值,并控制你需要使用瀑布法的顺序(见乔的答案)。 如果有一些情况是独立的,你可以使用并行方法。 并行方法的一个例子如下

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

这样做是使所有的请求并行,并给你一个callback,当他们都完成了。 这是你会按摩你的数据的地方。

控制stream程库列表:

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