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.