4

だから私はfb apiを初期化しました

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 is undefined が取得されます。

関数をwindow.fbAsyncInit内に配置すると正常に動作しますが、window.fbAsyncInitの外でFBを呼び出す必要があります。

それを行う可能な方法があれば?

4

1 に答える 1

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();
}
于 2012-10-05T12:37:10.443 に答える