2012-12-09 71 views
1

我想用Facebook JavaScript API來計算朋友的性別。問題是FB SDK基於異步調用,因此在所有查詢完成後,我無法觸發Facebook JavaScript SDK:在返回所有查詢後運行一些東西

例如,下面是計算我擁有多少男性/女性朋友的代碼。但最後一行將不起作用,因爲它可以在FB.api()仍在運行時執行。

處理這個問題的最佳方法是什麼?

FB.api('/me/friends', function(response) { 
    if(response.data) { 
     var genderCount = {}; 

     $.each(response.data, function(index, friend) { 
      FB.api('/' + friend.id, function(frienddata) { 
       if (frienddata.gender) { 
        if (genderCount[frienddata.gender]) { 
         genderCount[frienddata.gender]++; 
        } 
        else { 
         genderCount[frienddata.gender]=1; 
        } 
       } 
      }); 
     }); 
}); 

// later do something with genderCount 

alert('I have ' + genderCount['male'] + ' male friends'); // won't work 
+0

對已完成的查詢數使用計數器,並在增加所述計數器之後調用在每個查詢的回調中檢查此計數器的函數。計數器達到查詢數量==回調函數執行某些操作。 – CBroe

回答

0

首先,你可能想使用更高效的fql查詢,如

SELECT name, sex, uid 
FROM user 
WHERE uid in (
    SELECT uid2 
    FROM friend 
    WHERE uid1 = me() 
) 

只需將此傳遞到graph.facebook.com/fql?q=SELECT%20%name....

然後,移動警報插入到響應處理程序,在您完成數字的總結之後。

FB.api('/fql', 
    {q: "SELECT name, sex, uid FROM user WHERE uid in (SELECT uid2 FROM friend WHERE uid1 = me())"}, 
    function (response) { 
    if (response.data) { 
     var genderCount = { 
      male: 0, 
      female: 0, 
      unknown: 0 
     }; 
     response.data.forEach(function (row) { 
      genderCount[row.sex || 'unknown']++; 
     }); 
     alert(JSON.stringify(genderCount)); 
    } 
}); 
+0

謝謝,這是最好的方法。 – mh2

0
FB.api('/me/friends', function(response) 
{ 
if(response.data) 
{ 
    var genderCount = {}; 
    var i = 0; 
    function GetGender(friend_id) 
    { 
     FB.api('/' + friend_id, function(frienddata) 
     { 
      if (frienddata.gender) 
      { 
       if (genderCount[frienddata.gender]) 
       { 
        genderCount[frienddata.gender]++; 
       } 
       else 
       { 
        genderCount[frienddata.gender]=1; 
       } 
      } 

      if(i == response.data.length - 1) 
      { 
       Results(genderCount); 
      } 
      else 
      { 
       GetGender(response.data[++i].id); 
      } 
     }); 
    } 

    GetGender(response.data[i].id); 
} 
}); 


function Results(genderCount) 
{ 
// here you are after all the calls 
} 
+0

通常,最好給出一些關於你在這裏做了什麼的描述,以及爲什麼它是答案。 –

相關問題