2011-11-16 133 views
0

這是一個相當普遍的問題,我在這裏,所以我想我會問,希望有人可以幫助我。Facebook API JavaScript未定義

我使用Facebook JS橋登錄Flex應用程序,而我試圖通過用戶名恢復爲應用程序,但我對面,我將代碼後解釋的事情來:

function getFriends() { 
      var nameOfPlayer = ""; 
      FB.api('/me', function(response) { 
       nameOfPlayer = response.name; 
       }); 
      return nameOfPlayer; 
     } 

如果我有我的flex應用程序打印nameOfPlayer,它會返回undefined,就像我使用nameOfPlayer執行警報一樣​​,但是如果我在FB.api調用nameOfPlayer內部發出警報,那麼它會彈出我的名稱,但它仍然不會返回名稱。我試着讓它返回一個通用字符串,並且工作,所以它傳遞的信息,它只是不保存到變量。任何想法如何解決這個問題?這可能是非常複雜的,所以如果我需要澄清任何事情讓我知道。預先感謝您給我的任何幫助:)

回答

0

你應該以事件驅動的方式做到這一點。下面列出了一些僞代碼,以幫助您開始。

var yourFacebookAPIClass = new yourFacebookAPIClass(); 
yourFacebookAPIClass.addEventListener(Event.UserCallComplete, function(ev){ 
    var nameOfPlayer = SomeParser.ParseData(ev); 
    someFunctionThatUsesYourVar(nameOfPlayer); 
}); 
yourFacebookAPIClass.getNameOfPlayer(); 

在你的Facebook API類:

function getNameOfPlayer(){ 
    makeTheApiCallHere(); 
} 
0

您在FB.api調用中定義的函數實際上是一個回調函數,這意味着它被異步調用。因此,api調用之後的代碼行(return語句)將立即執行,而無需等待Facebook返回響應。另一方面,回調函數將等待Facebook響應,實際上這就是它的設計目的。你最好做所有依賴於該回調函數中nameOfPlayer的邏輯。

如果你一定要返回一個nameOfPlayer變量它是寫你需要告訴你的代碼等待nameOfPlayer要定義的方式:

function getFriends() { 
      var nameOfPlayer = ""; 
      FB.api('/me', function(response) { 
       nameOfPlayer = response.name; 
       }); 
      while(typeof nameOfPlayer === "undefined" || nameOfPlayer == "") {} 
      return nameOfPlayer; 
     } 

但我真的因爲你的應用程序不會推薦在等待迴應時將凍結。你最好在你的回調函數中做所有的事情,而不是返回一些東西。

祝你好運! :)

+0

謝謝你,這就是我的想法是怎麼回事,因爲我看到別的某個地方,但我不知道如何解決它,如果你不介意我問,你如何建議在回調中做所有事情? –

+0

是的,使用nameOfPlayer變量的最可靠的方法是在回調中。如果你不想在該函數中插入太多的邏輯,你總是可以將nameOfPlayer變量傳遞給另一個函數,但是你仍然需要從回調函數中調用該函數,以保證它的正確定義。 – Adam