空数组的google.maps.LatLng对象

时间:2018-03-20 16:01:25

标签: javascript google-maps google-maps-api-3

首先,我正在尝试使用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);
      }
    });
  } 

1 个答案:

答案 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错误。如果遇到这种情况,您可能希望在代码中加入一些延迟逻辑。