2013-01-09 100 views
0

我在Javascript中遇到同步問題。下面的代碼。當我撥打電話,以獲得共同的朋友,雖然我的功能仍然通過API回調填充陣列的"Quite a bunch: 0"印刷發生的以前印刷 - console.log(friendID +" -> " + mutualfriends.data.length);Facebook Api呼叫準備

我知道這一定是一個回調/非同步問題,但我不知道如何處理它。我正在填充數組,因爲一個原因 - 需要填充下一部分。

代碼:

function getMutualFriends(friendID) 
{ 
    //console.log(response.data[i].id); 
    try{ 

      FB.api('/me/mutualfriends/'+friendID, function(mutualfriends) { 
      //console.log(mutualfriends); 
      //console.log(mutualfriends.data.length); 

      console.log(friendID +" -> " + mutualfriends.data.length); 
      mutualFriendsList.push([friendID,mutualfriends.data.length]); 
      }); 
    } 
    catch(err){ 
    console.log('error caught: ' +err); 
    } 

} 

function getFriendsList() 
{ 
    FB.getLoginStatus(function(response){ 
    FB.api('/me/friends', function(response) { 

     for(i=0; i<response.data.length;i++) 
     { 
      var friendID = response.data[i].id; 
      console.log(friendID); 
      friendsList.push(friendID); 
     } 

     console.log('Interesting, we gathered: '+friendsList.length+' friends,'); 

     console.log('lets check mutual friends now'); 

     for(j=0; j<friendsList.length;j++) 
     { 
      getMutualFriends(friendsList[j]); 
     } 

     console.log('Quite a bunch: ' + mutualFriendsList.length); 

     });//friends 
    }); 
} 

回答

3

你可能會想要把你的「後置條件」的代碼放到一個回調。

那麼,你現在有:

for(j=0; j<friendsList.length;j++) 
{ 
    getMutualFriends(friendsList[j]); 
} 

console.log('Quite a bunch: ' + mutualFriendsList.length); 

你會想是這樣的:

for(j=0; j<friendsList.length;j++) 
{ 
    getMutualFriends(friendsList[j], function(mutualFriendsList) { 
    console.log('Quite a bunch: ' + mutualFriendsList.length); 
    }); 
} 

當你設置它這樣,你getMutualFriends函數可以調用回調一旦它得到了結果爲:

function getMutualFriends(friendID, callback) 
{ 
    FB.api('/me/mutualfriends/'+friendID, function(mutualfriends) { 
    mutualFriendsList.push([friendID,mutualfriends.data.length]); 
    callback(mutualFriendsList); 
    }); 
} 

這將爲每次撥打電話getMutualFriends。如果您希望回撥只觸發一次全部的朋友,則需要進一步擴展該概念。

更新

您可以結合使用@ RGDev的病情上述「每個朋友」回調來檢測最後的朋友:

for(j=0; j<friendsList.length;j++) 
{ 
    getMutualFriends(friendsList[j], function(mutualFriendsList) { 
    if (mutualFriendsList.length == friendsList.length) { 
     console.log('Quite a bunch: ' + mutualFriendsList.length); 
    } 
    }); 
} 
+0

乾杯很坦率,非常感謝! – malteseKnight

0

getMutualFriends是他自己做的一個異步調用(通過調用FB.api),所以直到把它完成,你不能打印mutualFriendsList(實際上,你正在做5調用getMutualFiends讓你在所有人完成異步處理之前,mutualFriendsList將不準確)。

難道你不能依靠那個集合來做異步嗎?我不知道你在做什麼,但也許(如果你正在通過例子在屏幕上繪製它),你可以在每次FB.api('/ me/mutualfriends /')的回調時重新繪製該組件。 + friendID,...)完成。

我過去遇到類似問題,我使用backbone.js的集合而不是簡單的javascript數組解決了這個問題。然後,我將偵聽器綁定到集合的添加事件,並在每次添加對象時打印出好幾個朋友。

祝你好運,

0

你可以使用while循環要等到mutualFriendsList.length等於friendsList.length。這意味着所有的ajax函數都返回了函數。

它看起來是這樣的:

while(mutualFriendsList.length != friendsList.length) 
{ 
console.log("Still Waiting"); 

} 
console.log('done') 
// do your data processing 

有點不雅,但它應該工作

+0

這將創建一個緊密的循環,這是一個壞主意在異步回調中。根據朋友的數量和'FB.api'調用的週轉時間,您的CPU可能會在該循環中旋轉幾秒鐘。 –

+0

是的,你的解決方案好多了,我從來沒有使用過回調函數。我會牢記以備將來使用。 – RGdev