[英]Express | Making multiple http requests asynchronously
我目前正在构建一个小型节点应用程序,该应用程序会进行一些api调用并呈现一个带有图表的网页。 我正在使用express和jade作为渲染引擎。
问题是我对javascript很陌生,而且我不知道如何计划我的http请求,因此当有多个请求时,我可以传递从api(http get)获得的变量对象。 我不知道如何将其映射为单个对象并将其发送到玉渲染引擎。
这是我到目前为止所拥有的:
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返回给我的某些元素制作一个对象,并将其发送给Jade,这样我就可以使用页。
您可能想使用异步来解决这个问题。 对于这样的简单事情, async.parallel
是一个不错的选择:
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
)-一旦一个错误被调用,最后一个函数将被相同的错误调用,其余的回调将被忽略。
您可以异步并行 。
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
});
您的页面呈现的原因是回调尚未“回调”。 要执行您想要的操作,您需要执行以下操作:
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);
});
});
});
这种策略导致了所谓的“金字塔代码”,因为嵌套的回调函数的结局越来越深。
我还建议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
方法并行进行调用,并且仍然保持回调的顺序。
亚伦GL
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.