2012-07-22 73 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