Javascript 如何在回调函数之外使用FB.api(JSSDK)响应?

Javascript 如何在回调函数之外使用FB.api(JSSDK)响应?,javascript,facebook,facebook-graph-api,facebook-javascript-sdk,Javascript,Facebook,Facebook Graph Api,Facebook Javascript Sdk,我在登录或调用api方面没有任何问题,我只是在获取api回调之外的响应方面有问题。我知道它是异步运行的,所以我想把它放在一个返回响应的函数中。这是我的想法 //What I would like to be able to do function fbUser(){ FB.api('/me', function(response){ //this logs the correct object console.log(response); }); //How

我在登录或调用api方面没有任何问题,我只是在获取api回调之外的响应方面有问题。我知道它是异步运行的,所以我想把它放在一个返回响应的函数中。这是我的想法

//What I would like to be able to do
function fbUser(){
   FB.api('/me', function(response){
      //this logs the correct object
      console.log(response);
   });
//How do I get the response out here?
return response;
}
我希望在开始时调用/meAPI函数一次,然后将其传递给我的视图对象(我只使用主干视图中的响应),并根据需要进行其他api调用。目前,通过从回调内部调用视图,我可以实现某些功能

//What I am doing now, but I lose the ability to pass anything other than the 
//the current response to this function/View
FB.api('/me', function(response){
     var newView = new facebookView({model: response});
   });
我最初尝试过这个,但是因为api调用是异步的,所以我遇到了一些未定义的问题

//What I started with but had async issues
var fbResponse;
FB.api('/me', function(response){
     fbResponse = response;
   });
//I would then try and use fbResponse but it would be undefined

当我做出第二个反应时,我失去了第一个反应。例如,我的第一个api调用是to/me以获取用户信息。然后,我可以调用/your fb id/photos并获取照片,但如果我调用photo api回调中的另一个函数,我只能引用该响应,因为我丢失了原始的/me响应。如果我能从回调中得到响应,那么我就能够根据需要传递它。我知道响应只在回调内部有效,所以考虑到它的异步性,我如何使它在回调外部有效?

好的,我想明白了。我花了很长时间,阅读了很多不同的页面。我所说的我想做的是所有关于回调和关闭的交易。我将首先讨论回调问题。因为FB.api函数是异步的,所以您永远不知道它何时返回。您可以停止Javascript或设置计时器,但这是一种可怕的方法。你需要回电话。实际上,FB.api正在使用回调。这就是作为第二个参数的匿名函数。我所做的是创建另一个调用fbUser并使用回调的函数。以下是我所做的:

function startThis() {  
    var getUser = fbUser(function(model){
        console.log(model);
        startapp(model);
    }); 
};

function fbUser(callback){  
        FB.api('/me', function(response){
                callback(response);
            });
}
start此函数在Facebook验证响应为肯定时调用。然后调用具有回调的fbUser函数。回调函数从FB.api函数返回回调。因为startThis使用回调函数,返回值被称为model,所以在回调函数返回之前,其他代码不会执行。没有更多未定义的问题。这些函数只是包装器,用于获取Facebook对我的观点的响应。我可能添加了太多的抽象层,但是如果您想传递响应,这就是方法

第二,我想把这一反应传递给另一种观点。例如,一个视图加载基本信息(使用fbUser的响应)。我现在想把它传递给另一个加载照片的视图(我知道这不是MVC的最佳实践,但通过使用Facebook,我对模型没有太多控制权)。但我遇到的问题是,我无法将原始响应传递到下一个视图,因为FB.api调用的回调函数内部
引用了
窗口
,而不是我所在的对象。解决方案:闭包。我不会很好地解释这一点,但是闭包是函数中的局部变量,在匿名函数中仍然有引用。以下是我的解决方案,可以说明我所说的:

photos: function(){
            var This = this;
            var apiString = '/' + this.model.id + '/photos';
            FB.api(apiString, function(response){
                loadPhoto(response,  1, This.model);
            });
loadPhoto函数是一个用于加载照片视图的包装器(我知道主干可以帮助我加载不同的视图,但我一次只解决一个问题)。它将photoapi调用作为模型,将数字作为偏移量,并使用origanl响应。此函数的第一行将其设置为局部变量this。这允许我在匿名回调函数中引用调用它的对象


我希望这可以帮助一些人,因为我花了很多时间和测试时间来找到解决方案。如果您不知道回调或闭包是如何工作的,则很难找到您要查找的信息。

谢谢!它在完全相同的情况下帮助了我!