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