添加到全局数组变量的项不会在添加函数之外保留

时间:2011-11-28 05:18:27

标签: javascript google-maps-api-3

我尝试使用Google地图JavaScript API在两点之间划一条线。这两个点需要进行地理编码(转换为google.maps.LatLong对象)才能用于绘制线条。

Geocoding函数是codeAddress,当它返回时,它调用回调函数,该函数将新latlong添加到名为points的全局数组中。由于某种原因,添加到点的值不会在数组外部持久存在。我对JavaScript比较陌生,所以我无法说出可能出现的问题,任何想法都会受到赞赏!

var points = new Array();

function addGeocodedLatLongToGlobalList(address) {
        points.push(address);
        alert("added a point " + points[0]); // correctly outputs latlong object
    }

function codeAddress(address) {
    geocoder = new google.maps.Geocoder();
    geocoder.geocode({ 'address': address, }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            addGeocodedLatLongToGlobalList(results[0].geometry.location);
        } else {
            alert("Geocode was not successful for the following reason: " + status);
        }
    });
}

function drawLine(address1, address2, color) {

    codeAddress(address1);
    codeAddress(address2);

    alert("there is a point " + points[0]);  //now the points[0] value is undefined
    ...

2 个答案:

答案 0 :(得分:2)

我猜你在异步地理编码功能完成之前正在查看点数组,并且这些点实际上已被放入数组中。

geocoder.geocode()函数可能是一个异步函数,您对codeAddress函数的调用仅启动该进程,并在稍后完成。这可以解释为什么drawLine()函数中的alert()没有看到任何点 - 它们还没有。当geoCode函数实际完成并调用它的回调时,它们将被放入points数组中。

答案 1 :(得分:0)

可能的问题是您作为第二个参数传递给geocoder.geocode的回调函数尚未被调用。地理编码器可能刚刚存储它以便稍后在某些事件时调用它。将一些alert放入回调函数中以查看它是否真的被调用了!

...
geocoder.geocode({ 'address': address, }, function (results, status) {
        alert("CALLBACK CALLED!!");
        if (status == google.maps.GeocoderStatus.OK) {
...