1

的成员我正在创建一个javascript facebook应用程序以概览我的朋友列表。其实我可以检索我的(登录用户=我)朋友列表,当我点击一个朋友列表时,我可以看到列表中的所有朋友。Facebook批处理/ fql朋友列表朋友是

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

例如在列表中“最佳”我有3个朋友:阿托斯,PORTOS,阿拉米斯。但他们也在其他名单。所以,在我的应用我想获得这样的事:

  • 通过Athos:最佳,家庭,亲密朋友,VIP
  • PORTOS:最佳,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请求,大名单很慢......因此,我想亲用户帮我把这个放在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"); 
} 
); 

我希望这个问题和代码样本足够清晰。感谢您的帮助!

+1

如何首先获取朋友和朋友列表,然后将数据放在客户端?我认为这会比试图通过API来实现更高效。 – CBroe

回答

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数据过滤方案,以允许用户排序​​/过滤/ etc。在飞行中。

+0

谢谢你,我不认为我能达到这样的目标。我想通过向每次点击发出一个请求给FB来使用“懒惰”的方式。正如你所建议的,我最初得到的一切,保存在一些对象的数组中,并在客户端上工作,而不再与FB交互。缺点:手动更新这些“缓存”数组每次我会做一个操作,如从列表中删除一个朋友,添加一个等,但是这样我肯定会提高我的javascrpt技能。关于同位素(没有时间试一试),我们可以说它与jQuery模板类似吗?再次感谢! – firepol

+0

快速浏览同位素网站。这不像其他任何东西。是的,如果您基于此更新好友列表,则必须再次抓取所有内容,但它仍然只有一个API调用,所以即使这样做也应该很快。 – cpilko

+0

cpilko:thx again - 你可以看到解决方案的实际应用,在我的新应用中使用同位素过滤和动画(以前的“沙盒”现在是公开的,你可以测试它):friendsmanager.pbworks.org – firepol