1

FacebookJavaScriptAPIを使用して友達の性別をカウントしようとしています。問題は、FB 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
4

2 に答える 2

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));
    }
});
于 2012-12-09T04:01:49.807 に答える
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
}
于 2012-12-09T01:14:14.103 に答える