2012-10-05 47 views
4

外面,所以我有FB API初始化如何調用FB.api window.fbAsyncInit

window.fbAsyncInit = function() { 
     FB.init({ 
      appId : '351808841561163', 
      status : true, // check login status 
      cookie : true, // enable cookies to allow the server to access the session 
      xfbml : true, // parse XFBML 
      oauth: true 
     }); 

和我有一個功能的單獨js文件:

function example(){ 
    FB.api(
    '/me/[namespace]:visit', 
    'post', 
    { channel: link}, 
    function(response) { 
     if (!response || response.error) { 
      console.log(response.error); 
     } else { 
      console.log('Follow was success! Action ID: ' + response); 
     } 
    }); 
} 

當我把這個我得到FB未定義。

當我把這個函數放在window.fbAsyncInit裏面,它可以正常工作,但我需要在window.fbAsyncInit之外調用FB。

如果有什麼可能的辦法做到這一點?

+1

應該有與CA125沒問題在_outside_上 - 但你必須在SDK初始化完成後調用它。 – CBroe

回答

12

只是排隊你的功能,然後在FB初始化後立即調用它。下面的代碼保證你的功能將在正確的順序被調用,FB完成初始化之後

輔助腳本,你包括在你的榜樣,前FB的init腳本:

var FB; // to avoid error "undeclared variable", until FB got initialized 
var myQueue = new Array(); 
function queueAdd(f){ 
    if (FB == undefined) 
    myQueue.push(f); 
    else 
    f(); 
} 

function processQueue(){ 
    var f; 
    while(f = myQueue.shift()) 
    f(); 
} 

的功能例如:

function example(){ 
    FB.api(
    '/me/[namespace]:visit', 
    'post', 
    { channel: link}, 
    function(response) { 
     if (!response || response.error) { 
      console.log(response.error); 
     } else { 
      console.log('Follow was success! Action ID: ' + response); 
     } 
    }); 
} 

queueAdd(example); // will run immediately if FB initialized. Otherwise, wait for FB first 

和FB部分:

window.fbAsyncInit = function() { 
    FB.init(blablabla); 
    processQueue(); 
} 
+0

太棒了!像魅力一樣工作! – RoLYroLLs

+1

謝謝!如果您需要傳遞一些參數,請使用queueAdd(function(){ 示例('1'); }); – Viktor

+0

@victor哇! –