我目前正在构建一个小节点应用程序,它会进行一些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以便我可以使用页面上的数据。
答案 0 :(得分:5)
您可能希望使用async来帮助解决此问题。对于像这样简单的事情,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
) - 只要一个错误被调用,最后的函数将被调用同样的错误其余的回调将被忽略。
答案 1 :(得分:2)
你可以async parallel。
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
});
答案 2 :(得分:1)
您的网页呈现的原因是回调避难所"回叫"然而。要做你想做的事,你需要做类似的事情:
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的step库。它会使你的代码看起来像:
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, 亚伦