我正在开发一个了解某人某些兴趣的移动应用程序,例如城市。例如,应用程序知道纽约。
我想在 panoramio api 中搜索纽约的照片,但为此我必须知道纽约市的坐标。所以我做了以下事情:
geocoder.geocode( { 'address': places[j].name}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK){
var request = $.ajax({type:"GET",
url: "http://www.panoramio.com/map/get_panoramas.php?set=public&from=0&to=20&minx="+ (results[0].geometry.location.lng()-distance) +"&miny="+ (results[0].geometry.location.lat()-distance)+"&maxx="+ (results[0].geometry.location.lng()+distance) +"&maxy="+ (results[0].geometry.location.lat()+distance) +"&size=medium&mapfilter=true",
dataType: "jsonp",
success : function(){
if(typeof places[j] !== "undefined")
succeeded.push(places[j].name);
}
});
requestPlaces.push(request);
}
});
这是在一个 for 循环中,该循环循环某个人的兴趣数量。places[j].name
是兴趣的名称。distance
是我想要图片来源的门槛。到目前为止,一切都很好。
然后我想将所有信息收集到 requestPlaces 数组中。requestPlaces 声明如下:
var requestPlaces = [];
我将所有执行的请求推送到该数组中,以便稍后我可以执行以下操作:
$.when.apply(null, requestPlaces).done(function () {
console.log("tamanho do request places: dentro do when apply" + requestPlaces.length);
console.log(arguments);
});
这就是问题所在。在$.when.apply(null, requestPlaces)
我得到大小 0 和参数是一个空数组。似乎它没有等待所有请求完成并推送到 requestPlaces 数组。我能做些什么来解决这个问题?
几个考虑:
此代码块在另一个 $.when.apply 块内,用于另一个获取人们兴趣的请求,这是有效的。
而且我知道我对 panoramio api 所做的请求正在返回成功的结果,并且与第一个输入无关$.when.apply(null, requestPlaces)
。
如果需要,完整的代码可以更好地理解:
for(var j = 0; j<places.length; j++){
geocoder.geocode( { 'address': places[j].name}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK){
var request = $.ajax({
type:"GET",
url: "http://www.panoramio.com/map/get_panoramas.php?set=public&from=0&to=20&minx="+ (results[0].geometry.location.lng()-distance) +"&miny="+ (results[0].geometry.location.lat()-distance) +"&maxx="+ (results[0].geometry.location.lng()+distance) +"&maxy="+ (results[0].geometry.location.lat()+distance) +"&size=medium&mapfilter=true",
dataType: "jsonp",
success : function(){
if(typeof places[j] !== "undefined")
succeeded.push(places[j].name);
}
});
requestPlaces.push(request);
}
});
}
$.when.apply(null, requestPlaces).done(function () {
console.log("size" + requestPlaces.length);
console.log(arguments);
});