2013-05-08 45 views
0

我正在向FB發送FB.login請求。但FB沒有定義,而JavaScript SDK仍在加載核心JavaScript資源。JavaScript與Facebook JavaScript SDK的遞歸錯誤

於是,我把支票拿到FB變量

function check_FB_variable(){ 
      if(typeof FB=='undefined'){ 
       check_FB_variable(); 
      }else{} 
      } 
      check_FB_variable(); 

但是這種做法給了我太多的遞歸錯誤。

於是,我把這個代碼

function check_FB_variable(){ 
      if(typeof FB=='undefined'){ 
       setTimeout(check_FB_variable,600); 
      }else{} 
      } 
      check_FB_variable(); 

但在這種方法中,前超時功能撥打電話功能向下移動,並給出錯誤 沒有定義的FB.login。

請幫忙。

回答

0

我用過類似的東西來檢查JQMobi是否存在,我不知道爲什麼,但我認爲拋出異常是因爲你每次調用指向函數的指針。

你應該嘗試檢查這樣的時間間隔(未測試): var facebookChecker = window.setInterval(fbCheck,200);

var fbCheck = function() { 
    if (typeof FB != 'undefined' && facebookChecker != null) { 
     window.clearInterval(facebookChecker); 
     facebookChecker = null; 

     // Whatever you want to do if facebook is loaded 
     // Example: InitFBLogin(); 
    } 
} 

或者你可以使用一個while語句(我用了一個):

/* 
* This JQ Fix tries to attach Jquery to a variable to ensure it exists. 
* - Marvin Brouwer. 
*/ 

var FixJQ = function() { 
    var JQFIX = null; 
    while (!JQFIX || JQFIX == null) { 
     try { 
      JQFIX = jQuery; 
     } catch (nothing) { jQuery = $; }; 
    }; 
    JQFIX = null; 
    return true; 
}; 

if (FixJQ()) { 
    FixJQ = null; 
}; 

的最後一個好處是,你可以把你下一步低於這個,因爲它會等到while循環結束。 我真的不知道哪一個更好/更快,但我確信最下面的那個會工作。

+0

你已經使用類似的方法,像我用setTimeout,設置timeInterval將調用函數200ms,但在此之前的代碼將執行。我只想讓代碼停在那裏。當FB設置時,我應該繼續下一行。 – lokeshjain2008 2013-05-08 10:44:44

+0

的確,功能是一樣的,但如果調用遞歸需要很長時間,則可以通過某些瀏覽器將其檢測爲錯誤腳本。 我有很多使用IE的經驗。 SetInterval曾經工作,但正如我指出的,我沒有測試過。 至於另一個,我已經在一個項目中使用它,它確實工作。 然而,我有一個腳本將我的所有javascripts合併到一個文件中,然後再渲染我的項目,所以這可能是問題所在? – 2013-05-08 13:37:01

+0

是的,您正確地調用遞歸在這種情況下不是一個好習慣。無論如何,我把我所有的代碼放在「check_FB_variable」函數中,所以它爲我解決了這個問題。我認爲如果傳遞一個回調函數將會很好。希望有人想出更好的解決方案。 – lokeshjain2008 2013-05-08 17:40:31