0

我用来登录用户的 Facebook Graph API 代码调用了我的getfriends()循环函数两次。如何更改代码以使循环函数仅调用一次,同时仍允许处于各种状态的用户登录?

    <html xmlns:fb="https://www.facebook.com/2008/fbml">
<head> 
<title>FB App</title> 
<script> 
var userList = [];
    userCount = 0;

function getfriends () {
    console.log("getFriends");
    var url = "/me/friends";
    FB.api(url, function (response) {
        userList = userList.concat(response.data);
        userCount = response.data.length;
        compareAllFriends();
    });
}

function compareAllFriends () {
    console.log("compareAllFriends");
    var i = 0, l = 10, userID;
    for (; i < l; i += 1) {
        userID = userList[i].id;
        compareFriendsWith (i, userID);
    }
}
function compareFriendsWith (i, id) {
    console.log("compareFriendsWith", i, id);
}

</script> 
</head> 
<body>
<div id="fb-root"></div>
<p align="right"><button id="fb-auth">Login</button></p>
<script type="text/javascript">// <![CDATA[
window.fbAsyncInit = function() {
  FB.init({ appId: 'APP_ID', 
        status: true, 
        cookie: true,
        xfbml: true,
        oauth: true});

  function updateButton(response) {
    var button = document.getElementById('fb-auth');

    if (response.authResponse) {
      //user is already logged in and connected
      FB.api('/me', function(response) {
        getfriends();
        button.innerHTML = 'Logout';
      });
      button.onclick = function() {
        FB.logout();
      };
    } else {
      //user is not connected to your app or logged out
      button.innerHTML = 'Login with Facebook';
      button.onclick = function() {
        FB.login(function(response) {
      if (response.authResponse) {
            FB.api('/me');
          } else {
            //user cancelled login or did not grant authorization
          }
        }, {scope:''});     
      }
    }
  }

  // run once with current status and whenever the status changes
  FB.getLoginStatus(updateButton);
  FB.Event.subscribe('auth.statusChange', updateButton);    
};

(function() {
  var e = document.createElement('script'); e.async = true;
  e.src = document.location.protocol 
    + '//connect.facebook.net/en_US/all.js';
  document.getElementById('fb-root').appendChild(e);
}());
// ]]></script>
</body> 
</html>
4

1 回答 1

3

看来问题可能updateButton()是运行了不止一次,然后又调用getfriends()了不止一次。

Facebook docs来看,既然你设置status: trueinit(),你不需要这一行:

  FB.getLoginStatus(updateButton);

这将在您调用的下一行中自动发生subscribe()。所以这可能就是你看到getfriends()被执行两次的原因。

如果这不起作用,一个快速但不太优雅的解决方法可能是有一个变量hasfriends,将其初始化为false,检查其内部的值getfriends(),如果它是 ,getfriends()则不执行任何操作true。如果是false,请将其设置为truein ,getfriends()以便 in 中的主代码getfriends()仅运行一次。

于 2012-07-22T18:08:57.350 回答