【问题标题】:facebook batch/fql friendlists a friend is member offacebook 批处理/fql 好友列表一个朋友是其中的成员
【发布时间】:2012-11-07 23:11:58
【问题描述】:

我正在创建一个 javascript facebook 应用程序来概览我的好友列表。实际上,我可以检索我的(登录用户 = 我)好友列表,当我单击好友列表时,我会在该列表中看到我的所有好友。

当我现在想要的是,当我点击一个列表时,我想查看属于该列表的朋友,以及我的朋友所属的逗号分隔列表。

例如在列表“最佳”我有 3 个朋友:Athos、Portos、Aramis。但它们也在其他列表中。所以在我的应用中,我想得到这样的东西:

  • Athos:最佳、家庭、亲密朋友、VIP
  • 波尔图斯:最佳,VIP
  • Aramis:最好的、亲密的朋友、派对动物

我尝试使用 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 请求,对于大型列表非常慢......因此我希望专业用户帮助我将其放入 batch (一个批次最多可以有 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");
}
);

我希望问题和代码示例足够清楚。感谢您的帮助!

【问题讨论】:

  • 先获取好友和好友列表,然后将数据放在客户端如何?我认为这比尝试通过 API 更有效。

标签: facebook facebook-javascript-sdk facebook-fql facebook-batch-request


【解决方案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 再次循环以查找它们所属的其他列表。

或者,您可以将这三个列表混合到一个演示页面中,并使用像 Isotope 这样的 jQuery 数据过滤方案来允许您的用户进行排序/过滤/等。在飞行中。

【讨论】:

  • 谢谢大佬,我认为我无法实现这样的目标。我想通过每次点击向 FB 发出请求来使用“懒惰”的方式。正如您建议的那样,我最初得到了所有东西,保存在一些对象数组中并在客户端中处理这些对象,而不再与 FB 交互。缺点:每次我都会手动更新这些“缓存”数组,例如从列表中删除朋友、添加朋友等,但这样我肯定会提高我的 javascrpt 技能。关于isotope(没时间试一试),能不能说和jquery模板差不多?再次感谢!
  • 快速浏览一下同位素网站。它与那里的其他任何东西都不太相似。是的,如果您基于此更新好友列表,您将不得不再次获取所有内容,但它仍然只是 1 个 API 调用,因此即使这样也应该很快。
  • cpilko:再次感谢 - 仅供参考,您可以在我的新应用程序中看到解决方案,同位素过滤和动画在这里(以前的“沙盒”现在是公开的,您可以测试它):friendsmanager.pbworks。组织
猜你喜欢
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
相关资源
最近更新 更多