Javascript无法设置变量值

时间:2011-08-23 21:49:05

标签: javascript facebook facebook-javascript-sdk

我正在尝试使用此函数将sortedScores设置为一个值...每当我在任何地方执行console.log时,它似乎都正确地存储了值,但它实际上无法正确设置sortedScores ...

function facebook(sortedfriends) {

        var myID;
        var access_token;
   FB.init({
        appId  : something,
            status : true,
            cookie : true,
            xfbml  : true,
   });

   FB.getLoginStatus(function(response, sortedfriends) {
           if(!response.session) {
               FB.login(function(response) {
                       myId = response.session.uid;
                       access_token = response.session.access_token;
                       //does stuff

                       if (!response.session) {
                           console.log('User cancelled login or did not fully authorize.');
                       }
                   });
           }
           else if(response.session) {
               myId = response.session.uid;
               access_token = response.session.access_token;
           var D = new Array();
               this.access_token = access_token;
               FB.api('/me/feed?access_token=' + access_token + '&limit=100', function(response, sortedfriends) {
               for( i=0; i<response.data.length; i++) {
                           var msg = response.data[i];
                           D.push(msg);
               }
                       sortedfriends = somefunction(D, myID);
                       //i know somefunction works because if i do console.log(sortedfriends) it shows me the right values...

               });

           }
   });
}

当我尝试     var朋友;     Facebook的(朋友); 朋友们是不确定的......停下来?

2 个答案:

答案 0 :(得分:2)

目前尚不清楚您在哪里尝试访问已排序的朋友,但我猜您的问题是Facebook登录是异步的,因此响应在facebook函数完成后的某个时间到来。因此,如果您在调用facebook函数后立即尝试使用sortedfriends数据,则数据将不会存在,因为登录调用尚未完成。

使用sortedfriends数据的唯一方法是从成功处理程序到登录调用(您的console.log已经验证数据是否存在)。如果要在其他代码中使用它,则将其他代码从成功处理程序调用到登录调用。调用facebook函数后,您无法立即调用该代码。

由于登录调用的异步性质,此逻辑无效(当facebook调用返回并且在执行后继续执行时,它尚未完成:

var sortedfriends = [];
facebook(sortedfriends);
// use sortedfriends here

相反,你必须做这种类型的结构:

var sortedfriends = [];
facebook(sortedfriends);
// nothing executes here

并且,在你的facebook调用中你有这个,添加一个函数调用你想要使用sortfriends数据的代码:

       else if(response.session) {
           myId = response.session.uid;
           access_token = response.session.access_token;
       var D = new Array();
           this.access_token = access_token;
           FB.api('/me/feed?access_token=' + access_token + '&limit=100', function(response, sortedfriends) {
           for( i=0; i<response.data.length; i++) {
                       var msg = response.data[i];
                       D.push(msg);
           }
                   sortedfriends = somefunction(D, myID);
                   //i know somefunction works because if i do console.log(sortedfriends) it shows me the right values...
                   // call the rest of your code here that will use sortedfriends
                   doSomethingWithSortedFriends(sortedfriends);

           });

答案 1 :(得分:0)

javascript函数不会更改传入的引用。您无法传递undefined并期望在函数执行后它将被定义。

相反,您应该将sortedFriends设为全局变量,而不是将其作为函数参数传递。请注意,执行sortedFriends内的ajax查询后将设置getLoginStatus的值,因此在执行facebook函数后,您将无法立即使用它。 / p>