1

ユーザーが住所を入力する Web サイトの場合、ユーザーが注文した商品を受け取ることができる、ユーザーに最も近い場所を見つけようとしています。

ユーザーの住所に基づいて、受け取り可能な場所を 2 ~ 5 に絞り込むことができます。そこで、ユーザーの住所 (地点 A) と受け取り可能な場所の間の距離を計算したいと思います。

ここのデモは、2 つのアドレスだけで問題なく動作します。2 つ以上のアドレスを処理できるように、コードを可能な限り調整しました。SOで適切にフォーマットできないように見えるため、JSコードをここに投稿しました。

コードには 2 つのアラートがあります。最初のアラートは、さまざまな集荷場所を正しく示しています。ただし、2 番目のアラートには常に最後の集荷場所が表示されます。

誰でも理由を説明できますか?


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);
    }    
});
4

1 に答える 1

2

ループ内で geocoder.getLocations を呼び出しています。geocoder.getLocations は非同期で実行されます。最初のリクエストの処理中に 2 番目のリクエストを受信すると、最初のリクエストをキャンセルします。

マルチスレッド geocoder.getLocations を使用する場合は、複数のインスタンスを作成する必要があります。

于 2011-04-12T15:23:08.697 に答える