2012-07-22 50 views
0

我用来登录用户的Facebook Graph API代码是调用我的getfriends()循环函数两次。我如何更改代码以便循环函数只被调用一次,同时仍允许各种状态的用户登录?Facebook登录认证代码调用循环功能两次

<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> 

回答

3

看来,问题可能是updateButton()运行不止一次而这又调用不止一次getfriends()更多。

the Facebook docs来看,因为你设置status: trueinit(),你并不需要这一行:

FB.getLoginStatus(updateButton); 

这将在您调用subscribe()下一行自动发生。所以这可能是为什么你看到getfriends()执行两次。

如果不工作,一个快,但更优雅的解决方法可能是具有可变像hasfriends,它初始化为false,检查getfriends()内其价值,并有getfriends()什么也不做,如果它是true。如果是false,请将其设置为中的true,以便getfriends()中的主代码仅运行一次。

+0

谢谢,我删除了该行,它现在可以工作 – Edward 2012-07-22 19:59:04

+0

我说得太快了。删除该行解决了问题,但尚未登录Facebook的用户无法登录该应用。如果没有该行,则需要先登录Facebook,因为登录按钮无效。 – Edward 2012-07-24 02:47:55