2

JavaScript と Graph API を使用して Facebook からアルバム リストを取得しようとしています。私はこのようにやっています:

FB.api('/me/albums', function(response){
    //
});

アルバム カバーは、HTML に挿入できる URL ではなく、写真 ID として返されます。したがって、2 番目のステップで URL を取得する必要があります。しかし、アプリケーションの設計上、後で URL を取得して画像を挿入することはできません。アルバム プロパティ (ID、名前、カバー 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 のない戻りオブジェクトを残すことです。それほど難しいことではないと思いますが、十分な解決策を見つけることができません。どんなアイデアでも大歓迎です。

4

2 に答える 2

6
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>

これはあなたを助けるかもしれません。

于 2012-08-14T12:16:52.680 に答える
2

問題は、ループがカバー クエリを待機せずに先に進み、カバー URL のない戻りオブジェクトを残すことです。

もちろん、FB.api は非同期メソッドであるためです。

それほど難しいことではないと思いますが、十分な解決策を見つけることができません。

ループ内の 2 番目の FB.api 呼び出しにもコールバック関数を使用し、カウンターを実装する必要があります。このカウンターがすべての要求が完了したことを示したら、データを別の場所に渡すことができます。 (または、メソッドが非同期であるため、「返す」ことは機能しないため、その関数ですぐに使用します)。

すぐに FQL を使用する方がよいかもしれません。必要なデータを「結合」して、1 回の呼び出しですべてを取得できるからです。fe としてのマルチクエリのようなもの

{
  "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)"
}

( Graph API エクスプローラーでこのクエリをテストします。 )

于 2012-08-14T11:31:57.563 に答える