首先,我正在尝试使用google.maps.visualization.HeatmapLayer
创建热图。
我试图调用函数codeAddress
n次,每次调用它时,它应该在全局数组google.maps.LatLng
中创建一个新的locationsList
对象,但是当我尝试在函数locationsList
上返回getPoints
它是空的。
知道为什么吗?
var locationsList = [];
var counter = 0;
function getPoints(latitude, longitude) {
codeAddress(" APIAI, SP, Brasil",2271.96);
codeAddress(" Avaré, SP, Brasil",8.77);
codeAddress(" Barueri, SP, Brasil",263.1);
codeAddress(" Caçapava, SP, Brasil",2130.24);
codeAddress(" Cajati, SP, Brasil",157.26);
codeAddress(" Campinas, SP, Brasil",83.28);
codeAddress(" CARAGUATATUBA, SP, Brasil",325.08);
console.log("All codeaddress ended "+locationsList.length); // prints 0 (array disappears?)
return locationsList;
}
function codeAddress(endereco, peso) {
geocoder.geocode( { 'address': endereco}, function(results, status) {
if (status == 'OK') {
var thislat = results[0].geometry.location.lat();
var thislong = results[0].geometry.location.lng();
locationsList[this.contador] = {location: new google.maps.LatLng(thislat,thislong), weight: peso};
console.log(locationsList.length);
contador++;
} else {
alert('Geocode was not successful for the following reason: ' + status);
}
});
}
答案 0 :(得分:0)
根据Google Docs,地理编码请求是异步的:
访问地理编码服务是异步的,因为Google Maps API需要拨打外部服务器。因此,您需要传递一个回调方法,以便在请求完成时执行。
您可以详细了解异步代码的工作原理here。
关于此代码:
function getPoints(latitude, longitude) {
codeAddress(" APIAI, SP, Brasil",2271.96);
codeAddress(" Avaré, SP, Brasil",8.77);
codeAddress(" Barueri, SP, Brasil",263.1);
codeAddress(" Caçapava, SP, Brasil",2130.24);
codeAddress(" Cajati, SP, Brasil",157.26);
codeAddress(" Campinas, SP, Brasil",83.28);
codeAddress(" CARAGUATATUBA, SP, Brasil",325.08);
console.log("All codeaddress ended "+locationsList.length); // prints 0 (array disappears?)
return this.locationsList;
}
在执行对codeAddress
的下一次调用之前,JavaScript不会等待每个地理编码请求完成。因此,getPoints
函数中的所有代码都会立即执行,因此当代码到达return this.locationsList
时,地理编码请求仍然在后台发生,locationsList
数组仍为空。 / p>
另外,正如@Preston在评论中提到的那样:
Javascript API中的地理编码服务有client-side rate limit,可防止同时发送过多请求。如果有太多未延迟的顺序codeAddress()调用,则可能会遇到OVER_QUERY_LIMIT错误。如果遇到这种情况,您可能希望在代码中加入一些延迟逻辑。