asynchronous在Node.js中调用模式到API
构build我的第一个“严重的”Node.js项目(使用Express)。
我需要对几个REST API使用几个调用,收集所有结果,按摩它们,并返回一个完整的JSON到客户端(HTML5 + AJAX)。
- 调用API A
- 调用API B
- 再次调用API A(来自B的结果)
- 将3个调用的结果处理成JSON
- 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程库列表: