1

友達リストの概要を把握するために、javascript facebook アプリを作成しています。実際には、(ログインしているユーザー = 私) フレンドリストを取得できます。フレンドリストをクリックすると、そのリストにすべてのフレンドが表示されます。

リストをクリックすると、そのリストに属する友達が表示され、友達がメンバーであるカンマ区切りのリストが表示されます。

たとえば、「ベスト」リストには、アトス、ポルトス、アラミスの3 人の友人がいます。しかし、それらは他のリストにもあります。したがって、私のアプリでは、次のようなものを取得したいと思います。

  • アトス:ベスト、ファミリー、親友、VIP
  • ポルトス:ベスト、VIP
  • アラミス: 親友、親友、パーティー アニマル

FQLマルチクエリで試してみましたが、欲しいものが得られないようです。

バッチリクエストを使用する必要があると思いますが、ここでバッチを使用した経験があまりないため、助けを求めています。

ここでは、リストに属する友人を取得するために使用する FQL クエリを示します。リストから始まる友達を管理したいので、これが必要です:

var listID = 123;//just enter a listID
var friendsInList = 'SELECT uid,username,profile_url,first_name,last_name,pic_square FROM user WHERE uid IN (SELECT uid FROM friendlist_member WHERE flid =' + listID +')';

今、クリーンで効率的な方法で進める方法がわかりません。私は機能しているが非効率的な解決策を持っています:

//[...]FB.api call to get a response object with all my friends using the friendsInList query above
for (var i = 0; i < response.length; i++) {
    friendID = response[i].uid;
    //call FB.api with the following query:
    var friendListMemberships = 'SELECT uid, flid, name FROM friendlist_member WHERE flid IN (SELECT flid FROM friendlist WHERE owner=me()) AND uid IN (select uid FROM friendlist WHERE flid =' + friendID;
}

上記の解決策は機能しますが、友人ごとに FB.api リクエストを送信するため、非常に非効率的です。大きなリストでは非常に遅くなります...したがって、これをバッチに入れるのをプロユーザーに手伝ってもらいたいです(バッチには最大数を含めることができます50 件のリクエストがあるため、1 ~ 2 件のリクエストだけを送信して、必要なものをすべて取得したいと考えています)。

私はバッチの書き方を知っています。2 番目のクエリで完了するのに役立つ場合は、コードの構造をここに示します。

var listID = _listID;

var _queryFriendsInList = 'SELECT uid,username,profile_url,first_name,last_name,pic_square FROM user WHERE uid IN (SELECT uid FROM friendlist_member WHERE flid =' + listID + ')';

var queryFriendsInList = _queryFriendsInList.replace(" ", "+");

var _queryFriendListMemberships = 'I have no idea what kind of query I can write here to get the lists my friends from queryFriendsInList are member of';

var queryFriendListMemberships = _queryFriendListMemberships.replace(" ", "+");

var searchArgs = {
    access_token: FB.getAuthResponse().access_token,
    batch: []
};

searchArgs.batch.push({
    'method': 'GET',
    'name': 'friendsInList',
    'relative_url': 'method/fql.query?query=' + queryFriendsInList,
    'omit_response_on_success': false
});

//here is where I need help
searchArgs.batch.push({
    'method': 'GET',
    'name': 'friendlistMememberships',
    'relative_url': 'method/fql.query?query=' + queryFriendListMemberships,
    'omit_response_on_success': false
});

FB.api("/", "POST", searchArgs,
function (response) {
    //console.log("log");
}
);

質問とコード サンプルが十分に明確であることを願っています。助けてくれてありがとう!

4

1 に答える 1

1

マルチクエリを使用すると、1 回の API 呼び出しで必要なものをすべて取得できます。クライアント側でいくつかのループを使用してこれを組み立てる必要がありますが、それほど難しくはありません。クエリは次のとおりです。

{
"all_friendlists":
    "SELECT flid, owner, name FROM friendlist WHERE owner=me()",
"fl_members":
   "SELECT uid, flid FROM friendlist_member WHERE flid IN 
      (SELECT flid FROM #all_friendlists)",
"fl_member_details":
   "SELECT uid, name, username FROM user WHERE uid IN (SELECT uid FROM #fl_members)" 
}

この 1 つの API 呼び出しから、すべてをユーザーに提示できます。#all_friendlistsクエリは、すべてのユーザーのフレンドリストを提供します。ユーザーがフレンドリストを選択したら、ループし#fl_membersてこのリストのすべてのメンバーを検索し、 から詳細を取得し#fl_member_detailsます。別のループを#fl_members作成して、それらが属している他のリストを見つけます。

または、これら 3 つのリストを 1 つのプレゼンテーション ページにまとめて、Isotopeなどの jQuery データ フィルタリング スキームを使用して、ユーザーが並べ替え/フィルタリングなどを実行できるようにすることもできます。急いで。

于 2012-11-07T15:11:58.683 に答える