对于用户输入其地址的网站,我正在尝试查找距离用户最近的位置,以便用户可以收集订购的商品。

根据用户的地址,我可以将可能的接送位置范围缩小到2到5之间。因此,我想计算用户地址(A点)与可能的接送位置之间的距离。

演示here仅使用两个地址即可正常工作。我已尽可能多地修改了代码以使用两个以上的地址。我发布了JS代码here,因为我似乎无法在SO中正确设置其格式。

代码中有两个警报。第一个警报正确显示了不同的取件位置。但是第二个警报始终显示最后取件的位置。

谁能解释为什么?



HTML:

<p id="hello">Hello World</p>


JavaScript:

var geocoder, location1, location2, gDir;

function initialize(counter) {
    if( counter == 0 ){
        geocoder = new GClientGeocoder();
        gDir = new GDirections();
    }
    GEvent.addListener(gDir, "load", function() {
        var drivingDistanceMiles = gDir.getDistance().meters / 1609.344;
        var drivingDistanceKilometers = gDir.getDistance().meters / 1000;
        $("#results").append('<strong>Driving Distance: </strong>' + drivingDistanceKilometers + ' kilometers<br /><br />');
    });
}

function getDistance(agency_add, counter) {
    initialize(counter);
    geocoder.getLocations(agency_add, function (response) {
        if (!response || response.Status.code != 200) {
            alert("Sorry, we were unable to geocode the address" + agency_add);
        }
        else {
            location1 = {lat: response.Placemark[0].Point.coordinates[1], lon: response.Placemark[0].Point.coordinates[0], address: response.Placemark[0].address};
            //alert("ONE: "+location1.address);
            geocoder.getLocations(document.forms[0].address1.value, function (response) {
                //alert("TWO: "+location1.address);
                if (!response || response.Status.code != 200) {alert("Sorry, we were unable to geocode the second address");}
                else {
                    location2 = {lat: response.Placemark[0].Point.coordinates[1], lon: response.Placemark[0].Point.coordinates[0], address: response.Placemark[0].address};
                    gDir.load('from: ' + location1.address + ' to: ' + location2.address);
                }
            });
        }
    });
}


$(document).ready(function(){
    //put each agency address in an array
    var agencies = [];
    $(".agency_field").each(function(index) {
        agencies.push($(this).val());
    });

    for (var i = 0; i < agencies.length; i++){
        var res = getDistance(agencies[i], i);
    }
});

最佳答案

您正在循环内调用geocoder.getLocations。 geocoder.getLocations异步运行。当它仍在处理第一个请求时收到第二个请求时,它将取消第一个请求。

如果要对geocoder.getLocations使用多线程,则需要创建它的多个实例。

10-08 16:40