Javascript 发出多个请求并将其传递给模板(Express+;Node.js+;FB open graph)
我正在使用构建一个Express Node.js应用程序,下面是我当前的根路径:Javascript 发出多个请求并将其传递给模板(Express+;Node.js+;FB open graph),javascript,node.js,express,request,Javascript,Node.js,Express,Request,我正在使用构建一个Express Node.js应用程序,下面是我当前的根路径: app.get('/', Facebook.loginRequired(), function (req, res) { req.facebook.api('/me', function(err, user) { res.render('index', {title: 'title', user: user}); }); }); 我正在调用FB open graph UR
app.get('/', Facebook.loginRequired(), function (req, res) {
req.facebook.api('/me', function(err, user) {
res.render('index', {title: 'title', user: user});
});
});
我正在调用FB open graph URL,但我想进行多个open graph调用以传递到我的模板。例如:
var APIcalls = ['/me', '/me/music', '/me/music.listens'];
req.facebook.api(APIcalls, function(err, res1, res2, res3){
res.render('index', {res1: res1, res2: res2, res3: res3});
});
对Facebook进行多个API调用,然后将响应相应地传递给我的模板,最简单的方法是什么?你可以看到。谢谢 这个场景对于async.map来说似乎是完美的 请看这里: async.map方法接受一个项目数组,并对数组中的每个项目并行执行相同的异步调用。如果没有遇到错误,它将使用新的结果数组调用回调 因此,您的示例如下所示:
var async = require('async'),
APIcalls = ['/me', '/me/music', '/me/music.listens'];
async.map(APIcalls,
function(item, callback){
req.facebook.api(item, function(err, user) {
if(err){
return callback(err);
};
callback(null, user);
});},
function(err, results){
if(err){
throw new Error(err);
}
res.render('index', results);
}
);
这个场景对于async.map来说似乎是完美的 请看这里: async.map方法接受一个项目数组,并对数组中的每个项目并行执行相同的异步调用。如果没有遇到错误,它将使用新的结果数组调用回调 因此,您的示例如下所示:
var async = require('async'),
APIcalls = ['/me', '/me/music', '/me/music.listens'];
async.map(APIcalls,
function(item, callback){
req.facebook.api(item, function(err, user) {
if(err){
return callback(err);
};
callback(null, user);
});},
function(err, results){
if(err){
throw new Error(err);
}
res.render('index', results);
}
);
为此,您应该使用,以便只需对Graph API发出一个请求即可
FB.api('/', 'POST', {
batch: [{
relative_url: '/me'
},{
relative_url: '/me/music'
},{
relative_url: '/me/music.listens'
}]
}, function(o) {
console.log(o);
});
或者,您可以使用多fql
FB.api('/fql', {
q1: 'select ....',
q2: 'select ...'
}, function(o) {
console.log(o);
});
完成后,您只需将数据合并到一个模型中,并将其传递给渲染器。为此,您应该使用,以便只需向Graph API发出一个请求即可
FB.api('/', 'POST', {
batch: [{
relative_url: '/me'
},{
relative_url: '/me/music'
},{
relative_url: '/me/music.listens'
}]
}, function(o) {
console.log(o);
});
或者,您可以使用多fql
FB.api('/fql', {
q1: 'select ....',
q2: 'select ...'
}, function(o) {
console.log(o);
});
完成后,您只需将数据合并到一个模型中,然后传递给渲染器。谢谢Andy!效果很好:)肖恩的答案是,使用批处理不是更好吗?这将意味着一个单一的请求,而不是几个并行的请求?有什么原因不能使用批处理吗?谢谢你接受我的回答:)谢谢安迪!效果很好:)肖恩的答案是,使用批处理不是更好吗?这将意味着一个单一的请求,而不是几个并行的请求?有什么原因不能使用批处理吗?谢谢你接受我的回答:)