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