Facebook图表api中的JSON返回太慢

时间:2012-09-05 14:56:33

标签: jquery json facebook-graph-api

我现在正在玩Facebook图形api。我正在获取所有用户朋友的个人资料和其他数据,并将它们作为标记放在谷歌地图上。

它正在工作但它似乎等待所有数据和图像在它开始显示之前返回。对不起,如果这太过分了,我是一个初学者。我已经尝试将JSON调用分解为几个回调函数,但这没有帮助。我希望收到数据后立即放置每个朋友的图像。

我的代码如下(4次使用jquery获取JSON的调用)。第一次调用获取朋友列表,然后为每个朋友获取图像和数据,然后获取位置数据。

$.getJSON("https://graph.facebook.com/" + userid + "/friends?access_token=" + token, function(data) {
                $.each(data.data, function(key, val) {
                    $.getJSON("https://graph.facebook.com/"+ val.id + "?fields=picture", function(idata) { 
                    var img = new Image();
                    img.src =  idata.picture;
                    $.getJSON("https://graph.facebook.com/"+ val.id + "?access_token=" + token, function(fdata) {
                        $.getJSON("https://graph.facebook.com/"+ fdata.location.id + "?access_token=" + token , function(ldata) {
                            $('#map_canvas').gmap('addMarker', {
                            'id': 'mark',
                            'position': ldata.location.latitude + ',' + ldata.location.longitude, 
                            'draggable': false, 
                            'bounds': false,
                            'icon' : image.src,
                            'title' : fdata.name,
                            'animation': google.maps.Animation.DROP,
                        }).click(function() {
                            $('#map_canvas').gmap('openInfoWindow', {'content': 'Name: ' + fdata.name  +  '</br>Location: ' + fdata.location.name }, this);
                        });
                    });
                    });
                });
                });     
                });

1 个答案:

答案 0 :(得分:1)

这个问题很慢的原因是你提出了很多疑问:一个是为了得到你的朋友名单,另外三个是为了让每个朋友得到他们的照片,?和位置。每个API调用都需要时间。很多时间。

首先,减少查询次数。使用Graph API,您可以获得两个所需的一切:

"https://graph.facebook.com/me/friends?fields=id,name,picture,location&access_token=" + token

然后遍历此查询的结果并提取所有location.id值,比如说成一个名为loc的数组。现在运行此查询:

"https://graph.facebook.com/?fields=location&ids=" + loc.join() + "&access_token=" + token

现在你可以遍历第一个结果来获取名称,图片和位置ID,它们遍历第二个结果以获得位置的纬度和经度。