GMaps JS Geocode:使用/传递变量与异步地理编码功能?

时间:2012-05-11 16:20:10

标签: javascript google-maps asynchronous geocode

我有一个位置对象的数组列表,我正在使用它们中的一些来构建一个完整的地址,然后对其进行地理编码。一旦我收到OK状态,我就会在地图上放置一个标记。一切正常。但是,现在我还要在每个标记上放置一个信息窗口,其中包含我的数组列表LocationName中的另一个属性。 代码在这里:

function placeMarkers(myObjList){
var geocoder = new google.maps.Geocoder();
for(var i=0; i<myObjList.length; i++){
    var fullAddress = myObjList[i].Address + ", " + myObjList[i].City + ", " + myObjList[i].State + ", " + myObjList[i].Zip;
    /* The variable I would like to have access to in the geocode call */
    var locationName = myObjList[i].LocationName;

    geocoder.geocode( { 'address': fullAddress}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            alert(locationName);
            var marker = new google.maps.Marker({
                map: map,
                position: results[0].geometry.location,
                clickable: true
            });
            markers.push(marker);
        } else {
            alert("Geocode was not successful for the following reason: " + status);
        }
    });
}
}

警报是在我获得该状态时查看locationName是什么。但在测试中,它总是一样的价值。一旦我可以定制这个以反映每次正确的值,那么我就会排列代码以将信息窗口放在标记上。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:4)

最简单的事情可能是在循环中创建一个本地范围块,这样每次添加委托/匿名函数进行地理编码时,locationName实际上都会引用不同的变量。将var放在循环中不会创建变量的新实例,var声明基本上会移动到封闭范围块的顶部。

for(var i=0; i<myObjList.length; i++){
    var fullAddress = myObjList[i].Address + ", " + myObjList[i].City + ", " + myObjList[i].State + ", " + myObjList[i].Zip;
    //begin scope block
    (function(){
        var locationName = myObjList[i].LocationName;
        var yourObject = myObjList[i];
         //etc.
        geocoder.geocode( ...);
    //end scope block
    })();
}

编辑:

或者,如果您使用某个框架/允许您传递匿名函数来执行数组中每个项目的代码,那么您将自动处理这种范围问题。