快递| asynchronous制作多个http请求

我目前正在构build一个小型节点应用程序,它可以进行几个API调用,并呈现一个包含图表的网页。 我使用快递和玉器作为渲染引擎。

问题是,我是相当新的JavaScript,我不知道如何计划我的HTTP请求,所以我可以传递一个对象的variables,我从api(HTTP获取),当有多个请求。 我不知道如何绘制出一个单一的对象,并将其发送给玉石渲染引擎。

这是我到目前为止:

app.get('/test', function(req, res) { apiRequestGoesHere(name, function(error, profile) { //Get some data here }); anotherApiRequest(tvshow, function(error, list) { //Get some data here }); res.render('test', data); }); 

现在,页面呈现和请求还没有完成,如果我把res.render放在其中一个请求中,我不能访问其他的数据。

所以我想要一个方法来设置它,所以我可以有多个api调用,然后从其他api返回给我的一些元素中创build一个对象,并将其发送给Jade,以便我可以使用页。

您可能想使用asynchronous来帮助这个。 async.parallel对于这样简单的事情async.parallel是个不错的select:

 app.get('/test', function(req, res) { async.parallel([ function(next) { apiRequestGoesHere(name, function(error, profile) { //Get some data here next(null, firstData); }); }, function(next) { anotherApiRequest(tvshow, function(error, list) { //Get some data here next(null, secondData); }); }], function(err, results) { // results is [firstData, secondData] res.render('test', ...); }); }); 

next这些函数的第一个参数应该是一个错误,如果相关(我把null ) – 只要一个错误被调用,最终的函数将被调用相同的错误,其余的callback将被忽略。

你的页面呈现的原因是callback没有“callback”。 要做你想做的事,你需要做一些事情:

 app.get('/test', function(req, res) { apiRequestGoesHere(name, function(error, profile) { //Get some data here anotherApiRequest(tvshow, function(error, list) { //Get some data here res.render('test', data); }); }); }); 

这个策略导致所谓的“金字塔代码”,因为你的嵌套callback函数越来越深。

我也会推荐Tim Caswell的步骤库。 这会使你的代码看起来像这样:

 var step = require('step'); app.get('/test', function(req, res) { step( function () { apiRequestGoesHere(name, this) }, function (error, profile) { if error throw error; anotherApiRequest(tvshow, this) }, function done(error, list) { if error throw error; res.render('test', list) } ) }); 

您也可以使用group方法来并行调用并保持callback的顺序。

Gl,Aaron

你可以asynchronous平行 。

 async.parallel([ function(callback){ // Make http requests // Invoke callback(err, result) after http request success or failure }, function(callback){ // Make http requests // Invoke callback(err, result) after http request success or failure } ], // optional callback function(err, results){ // the results array will be array of result from the callback });