Как определить, когда FB.init facebook завершен

В старом JS SDK была функция FB.ensureInit. Новый SDK, похоже, не имеет такой функции ... как я могу гарантировать, что я не буду делать вызовы API, пока он не будет полностью инициирован?

Я включаю это в начало каждой страницы:

<div id="fb-root"></div>
<script>
  window.fbAsyncInit = function() {
    FB.init({
      appId  : '<?php echo $conf['fb']['appid']; ?>',
      status : true, // check login status
      cookie : true, // enable cookies to allow the server to access the session
      xfbml  : true  // parse XFBML
    });
    FB.Canvas.setAutoResize();
  };

  (function() {
    var e = document.createElement('script');
    e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
    e.async = true;
    document.getElementById('fb-root').appendChild(e);
  }());
</script>
114
задан Pablo 23 August 2010 в 14:27
поделиться

1 ответ

Update on Jan 04, 2012

Похоже, что вы не можете просто вызвать FB-зависимые методы (например, FB.getAuthResponse()) сразу после FB.init(), как раньше, поскольку FB.init() теперь, похоже, асинхронный. Завернув ваш код в FB. getLoginStatus() ответ, похоже, сделает трюк с определением того, когда API полностью готов:

window.fbAsyncInit = function() {
    FB.init({
        //...
    });

    FB.getLoginStatus(function(response){
        runFbInitCriticalCode(); 
    });

};  

или если использовать fbEnsureInit() реализацию ниже:

window.fbAsyncInit = function() {
    FB.init({
        //...
    });

    FB.getLoginStatus(function(response){
        fbApiInit = true;
    });

};  

Original Post:

Если вы хотите просто запустить какой-то скрипт, когда FB инициализируется, вы можете поместить какую-то функцию обратного вызова внутри fbAsyncInit:

  window.fbAsyncInit = function() {
    FB.init({
      appId  : '<?php echo $conf['fb']['appid']; ?>',
      status : true, // check login status
      cookie : true, // enable cookies to allow the server to access the session
      xfbml  : true  // parse XFBML
    });
    FB.Canvas.setAutoResize();

    runFbInitCriticalCode(); //function that contains FB init critical code
  };

Если вы хотите точно заменить FB. ensureInit, то вам придется написать что-то самостоятельно, так как официальной замены нет (большая ошибка имо). Вот что я использую:

  window.fbAsyncInit = function() {
    FB.init({
      appId  : '<?php echo $conf['fb']['appid']; ?>',
      status : true, // check login status
      cookie : true, // enable cookies to allow the server to access the session
      xfbml  : true  // parse XFBML
    });
    FB.Canvas.setAutoResize();

    fbApiInit = true; //init flag
  };

  function fbEnsureInit(callback) {
        if(!window.fbApiInit) {
            setTimeout(function() {fbEnsureInit(callback);}, 50);
        } else {
            if(callback) {
                callback();
            }
        }
    }

Использование:

fbEnsureInit(function() {
    console.log("this will be run once FB is initialized");
});
138
ответ дан 24 November 2019 в 02:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: