2

我試圖通過JavaScript和Graph API從Facebook獲取專輯列表。我這樣做:使用facebook api獲取專輯封面

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

專輯封面回​​來作爲照片ID,而不是我可以插入到HTML中的網址。所以,我需要第二步獲得一個網址。但是,通過應用程序設計,我以後無法獲取網址並插入圖片。我需要返回一個完整的數據對象與專輯propereties(ID,名稱,封面網址)。我最後的嘗試如下:

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); 
}); 

問題是,循環不等待封面查詢和前進,留下沒有封面網址的返回對象。我認爲做起來不是那麼困難,但我找不到足夠長的解決方案。任何想法都歡迎。

回答

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); 
}); 

};

Apped使用

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> 

可能,這將幫助您專輯的細節。

2

問題是,循環沒有等待封面查詢和前進,留下沒有封面網址的返回對象。

當然,因爲FB.api是一個異步方法。

我覺得這樣做不是那麼難,但是我找不到足夠長的解決方案。

你必須使用一個回調函數你的第二個FB.api在循環調用的歡迎,並實現它的反 - 當該計數器顯示,所有的請求都做了,然後可以將數據傳遞到其他位置(或者在該函數中使用它,因爲「返回」它不起作用 - 因爲該方法是異步的)。

也許最好馬上使用FQL,因爲在那裏你可以將所需的數據「連接」在一起,只需一次調用即可完成;像f.e.這樣的多重查詢。

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

Test this query in the Graph API explorer.