在FB.init之后立即调用时,FB.api不起作用

时间:2011-12-13 18:30:39

标签: javascript facebook facebook-javascript-sdk

在FB.init之后立即调用时,FB.api不起作用。这是我使用的代码片段:

window.fbAsyncInit = function() {
  FB.init({
    appId : window.APP_ID,
    status : true,
    cookie : true,
    oauth : true,
    channelUrl : window.MASTER_URL + "channel",
    frictionlessRequests : true
  });

  window.COMPANY.init();
};

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

这是我的COMPANY.init()和COMPANY.fetchAllFriends():

friends: new Array(),

init : function() {
  // TODO

  COMPANY.fetchAllFriends();

  FB.Canvas.setSize($(document).height());
  FB.Canvas.setAutoGrow();
},    

fetchAllFriends : function() {
  FB.api('/me/friends', function(response) {
    if (!response || response.error) {
      return;
    }

    COMPANY.friends = new Array();
    $.each(response.data, function(index, value) {
      COMPANY.friends.push(value.id);
    });
  });
},

其中fetchAllFriends响应包含错误,其中显示“必须使用活动访问令牌来查询有关当前用户的信息。”。我确保(通过浏览器调试器)在调用FB.api之前调用FB.init。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:5)

好的,我解决了我的问题。我改变了:

window.fbAsyncInit = function() {
  FB.init({
    appId : window.APP_ID,
    status : true,
    cookie : true,
    oauth : true,
    channelUrl : window.MASTER_URL + "channel",
    frictionlessRequests : true
  });

  window.COMPANY.init();
};

为:

window.fbAsyncInit = function() {
  FB.init({
    appId : window.APP_ID,
    status : true,
    cookie : true,
    oauth : true,
    channelUrl : window.MASTER_URL + "channel",
    frictionlessRequests : true
  });

  FB.Event.subscribe('auth.login', window.COMPANY.init);
};

万一其他人想知道。我发现FB FB SDK在FB.init返回时尚未形成用户会话,因此您需要做的是使用init函数订阅'auth.login'事件。更多信息here

答案 1 :(得分:2)

您似乎没有检查用户的状态。您所做的只是初始化Facebook,您甚至不知道用户是登录Facebook还是拥有Facebook帐户。您需要调用FB.getLoginStatus并检查它们是否“已连接”。如果它们未连接,则无法获得访问令牌。如果它们已连接,那么您将获得访问令牌。