如何检测Facebook的FB.init何时完成?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (32)

旧的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>
提问于
用户回答回答于

看起来你不能像以前那样立即调用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;
    });

};  
用户回答回答于

实际上Facebook已经提供了订阅认证事件的机制。

在你的情况下,你使用的是“ status:true ”,这意味着FB对象将要求Facebook用户的登录状态。

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.getLoginStatus()”,您再次运行相同的请求。

相反,你可以使用FB.Event.subscribe订阅auth.statusChangeauth.authResponseChange事件,然后再调用FB.init

FB.Event.subscribe('auth.statusChange', function(response) {
    if(response.status == 'connected') {
        runFbInitCriticalCode();
    }
});

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
});

很可能,使用“ status:false ”时,您可以在FB.init之后运行任何代码,因为不会有异步调用。

扫码关注云+社区