变量被 ajax 响应覆盖

Variable overwritten by ajax response

使用 Google 地图和地理编码器,我试图遍历一个地址对象,return LatLng 地址,并使用原始详细信息和 latlng 地址创建标记在下面的 setMarker 函数中。

问题是,response[a] 被对象中的最后一个地址覆盖,因为 for 循环 运行 在 AJAX 结果之前 returned.

如何保存正在循环的当前response[a]中的数据,以便稍后调用setMarker()时,它包含正确的信息?

谢谢

          var limit = 0;

          for (a in response){

            if(limit<5){ // limit API calls

                  var addr = [response[a].Addr1, response[a].City, response[a].Zip];

                  geo = new google.maps.Geocoder();
                  geo.geocode({
                    address: addr.join(", "),
                    componentRestrictions: {
                    //  country: 'UK'
                    }
                  }, function (results, status) {

                    if (status == google.maps.GeocoderStatus.OK && results) {

                        var latitude = results[0].geometry.location.lat();
                        var longitude = results[0].geometry.location.lng();
                        var latlng = new google.maps.LatLng(latitude, longitude);

                        if(latitude!="" && longitude!=""){

                            bounds.extend(latlng);
                            map.fitBounds(bounds);
                            _this.setMarker(map, limit, latlng, response[a]);

                        }

                    } // if geo results

              });

            }

            limit++;

          }

您遇到的问题是经典问题,可以使用闭包函数解决。

当前代码类似于:

var a[20];

for(i=0;i<20;i++) {
    some_async_method() {
        //code that uses 'a[i]'
    }
}

使用闭包在异步函数中保留 var a 的范围:

var a[20];

for(i=0;i<20;i++) {
    (function(_a){
        some_async_method() {
            //code that uses 'a[i]' as '_a'
        }   
    })(a[i]);// self calling function that preserves the scope of a[i]
}

因此您的代码将如下所示:

var limit = 0;

for (a in response){

if(limit<5){ // limit API calls

      var addr = [response[a].Addr1, response[a].City, response[a].Zip];

      geo = new google.maps.Geocoder();
      (function(response_a){ // closure function to preserve scope of 'response[a]' 
          geo.geocode({
            address: addr.join(", "),
            componentRestrictions: {
            //  country: 'UK'
            }
          }, function (results, status) {

            if (status == google.maps.GeocoderStatus.OK && results) {

                var latitude = results[0].geometry.location.lat();
                var longitude = results[0].geometry.location.lng();
                var latlng = new google.maps.LatLng(latitude, longitude);

                if(latitude!="" && longitude!=""){

                    bounds.extend(latlng);
                    map.fitBounds(bounds);
                    _this.setMarker(map, limit, latlng, response_a);

                }

            } // if geo results

      });
    })(response[a]);

}

limit++;

}