2011-08-23 56 views
0

我试图让这个函数设置sortedScores为一个值...每当我做console.log它似乎存储值的权利,但它实际上不能设置sortedScores正确...Javascript无法设置变量值

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 friends; facebook(朋友); 朋友只是未定义... halp?

+0

它只是我还是拼写错误** halp **比它应该更常见?是否有一个原因? – ChaosPandion

+2

@ChaosPandion:http://www.google.se/search?q=halp&hl=sv&client=firefox-a&hs=MaK&rls=org.mozilla:en-GB:official&prmd=ivns&tbm=isch&tbo=u&source=univ&sa=X&ei=3yFUTo3bEYbHtAb0sOED&ved= 0CDoQsAQ&biw = 1074&bih = 897 – Guffa

回答

2

目前还不清楚您尝试访问sortedfriends的位置,但我猜你的问题是Facebook登录是异步的,所以在facebook函数完成之后的一段时间后会有响应。因此,如果您在调用facebook函数后立即尝试使用sortedfriends数据,则数据将不会存在,因为登录调用尚未完成。

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

因为登录调用的异步特性这个逻辑将无法正常工作(它尚未完成时facebook调用返回并执行后,继续说:相反,你必须做这种类型的

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

结构:

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

而且,你的Facebook的电话,你有这里面,添加一个函数调用您想要使用的sortedfriends数据的任何代码:

 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); 

      }); 
+0

非常感谢,这会奏效......但是当我与一个合作伙伴一起工作时,这意味着我们必须大大重新安排程序的其他部分......嗯。有没有其他办法?如果我确保Facebook完全执行,我可以在执行后执行代码吗? –

+0

一些Ajax调用可以同步,但这通常是一个糟糕的设计决策,因为它在网络调用期间锁定了浏览器。此外,这是Facebook的API,所以你可能甚至没有这个选项。因此,您只需重构代码即可完成完成功能,并在启动呼叫后不执行任何操作。这只是使用JavaScript(或任何其他语言)进行异步网络调用的生活。确保facebook通话完成的方法是从成功回调 - 没有更好的方法。 – jfriend00

0

javascript函数不会更改传入引用。您无法通过undefined,并希望在该函数执行后它将被定义。

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

+1

这很奇怪...所以我需要一些逻辑,如if(!sortedfriends)sortedFriends = somefunction(D,myID)?另外,使sortedfriends成为一个全局变量,以便在函数之外初始化它 –