Получение обложек альбомов с Facebook API
Я пытаюсь получить список альбомов из Facebook через JavaScript и Graph API. Я делаю это так:
FB.api('/me/albums', function(response){
//
});
Обложки альбомов возвращаются в виде идентификатора фотографии, а не URL-адреса, который я могу вставить в HTML. Итак, мне нужно получить URL на втором этапе. Но из-за дизайна приложения я не могу получить URL-адреса позже и вставить изображения. Мне нужно вернуть полный объект данных с характеристиками альбома (идентификатор, имя, адрес обложки). Моя последняя попытка указана ниже:
FB.api('/me/albums', { fields : 'id,name,count,cover_photo' }, function(response){
if (!response || response.error) {
callback.call(false);
return;
};
var parsed = $(response.data).map(function(){
if (this.count > 0) {
var result = {
aid : this.id,
title : this.name,
cover : this.cover_photo
};
return result;
};
});
for (var i = 0; i < parsed.length; i++) {
(function(i){
FB.api('/' + parsed[i].cover, { type : 'album' }, function(response){
parsed[i].thumb = response.picture;
});
})(i);
};
callback.call(parsed);
});
Проблема состоит в том, что цикл не ожидает запросов покрытия и идет вперед, оставляя возвращаемый объект без URL-адресов покрытия. Я думаю, что это не может быть так сложно сделать, но я не могу найти решение достаточно долго. Любые идеи приветствуются.
2 ответа
window.getAlbums = function() {
FB.api({
method: 'fql.multiquery',
queries: {
query1: 'select aid,name,link,photo_count,cover_object_id from album where owner = me()',
query2: 'SELECT pid,src FROM photo WHERE object_id IN (SELECT cover_object_id FROM #query1)'
}
},
function(response) {
var parsed = new Array();
$(response[0].fql_result_set).each(function(index,value){
var result = {
aid : value.aid,
title : value.name,
cover : response[1].fql_result_set[index].src,
link :value.link
};
parsed.push(result);
})
getdata(parsed);
});
};
Приложил детали вашего альбома, используя
function getdata(data){
$(data).each(function(index,value){
// console.log(value.aid + ' - '+ value.cover+ ' - '+ value.title );
$("#fb_albumb").append('<h3>'+ value.title +'</h3><a href="'+ value.link +'" target="_blank" ><img src="'+ value.cover +'" title="'+ value.title +'" /></a><br/>');
})
}
HTML
<fb:login-button scope="user_photos" onlogin="getAlbums()">Grant Permissions to Allow access to Photos and Albums</fb:login-button>
Может быть, это поможет вам.
Проблема состоит в том, что цикл не ожидает запросов покрытия и идет вперед, оставляя возвращаемый объект без URL-адресов покрытия.
Конечно, потому что FB.api - это асинхронный метод.
Я думаю, что это не может быть так сложно сделать, но я не могу найти решение достаточно долго.
Вы должны будете использовать функцию обратного вызова для ваших вторых вызовов FB.api в цикле, а также внедрить в нее счетчик - когда этот счетчик показывает, что все запросы выполнены, вы можете передать данные в другое место (или используйте его прямо в этой функции, потому что "возвращение" не будет работать - потому что метод асинхронный).
Может быть, лучше сразу использовать FQL, потому что там вы могли бы "соединить" необходимые данные вместе и получить их всего за один вызов; что-то вроде мультизапроса, например
{
"q1" : "SELECT aid, name, cover_object_id FROM album WHERE owner = me()",
"q2" : "SELECT aid, src_big FROM photo WHERE object_id IN
(SELECT cover_object_id FROM #q1)"
}