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