Javascript google.maps.LatLng对象的空数组

Javascript google.maps.LatLng对象的空数组,javascript,google-maps,google-maps-api-3,Javascript,Google Maps,Google Maps Api 3,首先,我尝试使用google.maps.visualization.HeatmapLayer创建热图 我尝试调用函数codeAddressn次,每次调用它时,它都应该在全局数组locationsList中创建一个新的google.maps.LatLng对象,但当我尝试在函数getPoints上返回locationsList时,它是空的。 知道为什么吗 var locationsList = []; var counter = 0; function getPoints(latitude

首先,我尝试使用
google.maps.visualization.HeatmapLayer
创建热图

我尝试调用函数
codeAddress
n次,每次调用它时,它都应该在全局数组
locationsList
中创建一个新的
google.maps.LatLng
对象,但当我尝试在函数
getPoints
上返回
locationsList
时,它是空的。 知道为什么吗

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);
      }
    });
  } 
根据,地理编码请求是异步的:

访问地理编码服务是异步的,因为Google Maps API需要调用外部服务器。因此,您需要传递一个回调方法,以便在请求完成时执行

您可以阅读有关异步代码如何工作的更多信息

关于本守则:

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;
}
JavaScript不会等待每个地理编码请求完成,然后再执行对
codeAddress
的下一个调用。因此,
getPoints
函数中的所有代码都会立即执行,因此当代码到达
时,返回这个.locationsList
,地理编码请求仍在后台进行,并且
locationsList
数组仍然为空

更新 此外,正如@Preston在评论中提到的:

JavaScriptAPI中的地理编码服务具有防止同时发送太多请求的功能。如果有太多未延迟的顺序codeAddress()调用,您可能会遇到超过查询限制的错误。如果遇到这种情况,可能需要在代码中加入一些延迟逻辑


此外,为了补充这个答案,Javascript API中的地理编码服务具有一个防止同时发送太多请求的功能。如果有太多未显示的顺序
codeAddress()
调用,您可能会遇到
OVER\u QUERY\u LIMIT
错误。如果遇到这种情况,您可能需要在代码中加入一些延迟逻辑。谢谢@Preston!我把它添加到我的答案中。