0

ユーザーのログインに使用しているFacebookGraphAPIコードは、getfriends()ループ関数を2回呼び出しています。さまざまな状態のユーザーがログインできるようにしながら、ループ関数が1回だけ呼び出されるようにコードを変更するにはどうすればよいですか?

    <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のドキュメントから判断すると、で設定status: trueしたinit()ので、次の行は必要ありません。

  FB.getLoginStatus(updateButton);

これは、を呼び出す次の行で自動的に行われますsubscribe()。そのため、おそらくgetfriends()2回実行されているのがわかります。

それが機能しない場合、迅速ですがあまり洗練されていない回避策は、のような変数を持ち、hasfriendsそれをに初期化しfalse、その値を内部でチェックし、getfriends()そうgetfriends()である場合は何もしないことtrueです。の場合はfalse、に設定してtruegetfriends()のメインコードgetfriends()が1回だけ実行されるようにします。

于 2012-07-22T18:08:57.350 に答える