Javascript 发出多个请求并将其传递给模板(Express+;Node.js+;FB open graph)

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

我正在使用构建一个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 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!效果很好:)肖恩的答案是,使用批处理不是更好吗?这将意味着一个单一的请求,而不是几个并行的请求?有什么原因不能使用批处理吗?谢谢你接受我的回答:)谢谢安迪!效果很好:)肖恩的答案是,使用批处理不是更好吗?这将意味着一个单一的请求,而不是几个并行的请求?有什么原因不能使用批处理吗?谢谢你接受我的回答:)