2011-08-23 67 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成爲一個全局變量,以便在函數之外初始化它 –