我正在创建一个javascript facebook应用程序来概述我的朋友列表。实际上我可以检索我的(登录用户=我)好友列表,当我点击一个好友列表时,我看到该列表中的所有朋友。
当我想要的时候,当我点击一个列表时,我希望看到属于该列表的朋友,以及我朋友所属的逗号分隔列表。
例如,在列表中“最佳”我有3个朋友: Athos,Portos,Aramis 。但他们也在其他名单中。所以在我的应用程序中,我想得到这样的东西:
我尝试使用FQL多重查询,但似乎无法获得我想要的结果。
所以我认为我应该使用Batch请求,但由于我没有很多使用批处理的经验,所以我请求你的帮助。
所以这里是我用来获取属于该列表的朋友的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请求给每个朋友,对于大型列表来说非常慢...因此我希望专业用户帮我把它放在{{3}中(一个批处理可以有最多50个请求,因此我只想发送1-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");
}
);
我希望问题和代码示例足够清晰。谢谢你的帮助!
答案 0 :(得分: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)"
}
您可以通过此一次API调用向用户展示所有内容。 #all_friendlists
查询会为您的所有用户提供好友列表。用户选择好友列表后,循环浏览#fl_members
以查找此列表的所有成员,并从#fl_member_details
检索其详细信息。再次通过#fl_members
循环查找他们所属的其他列表。
或者,您可以将这三个列表一起混合到一个演示文稿页面中,并使用jQuery数据过滤方案(如Isotope)来允许您的用户进行排序/过滤/等。在飞行中。