我用来登录用户的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>

最佳答案

看来问题可能在于updateButton()多次运行,而反过来又多次调用getfriends()

the Facebook docs来看,由于您在status: true中设置了init(),因此不需要以下行:

  FB.getLoginStatus(updateButton);


这将在调用subscribe()的下一行自动发生。因此,这可能就是为什么您看到getfriends()执行两次的原因。

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

关于javascript - Facebook登录身份验证代码两次调用循环功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11602687/

10-11 12:59