0

while ループで Geocode API を使用しようとしていますが、うまくいきません。while ループ内の if ステートメントは、while ループの最後まで評価されないようです。Geocode API が応答するのに時間がかかるためかどうか疑問に思っていますが、正しく評価できないようです。これが私のコードです:

 while (posts != j)
        {
            var image = server + '/location_marker.png';
            //var myLatLng = new google.maps.LatLng(locationLat[j],locationLong[j]);


            var address = addressGlobal[j];

            myLatLng = geocoder.geocode({ 'address': address }, function (results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var lat = results[0].geometry.location.lat();
                var lng = results[0].geometry.location.lng();
                var myLatLng = new google.maps.LatLng(lat,lng);
                alert(lat + lng);
                return myLatLng;
            }

         else {
            alert('Geocode was not successful for the following reason: ' + status);
        }
        });
            alert(myLatLng);                    
            place[j] = new google.maps.Marker({
                position: myLatLng,
                map: map,
                icon: image,
                url: postURL[j],
                title: postTitle[j]
            });   

            google.maps.event.addListener(place[j], 'click', function() {
                map.panTo(this.getPosition());
                map.setZoom(7);
                $("#fountainG").fadeIn(250);
                history.pushState(null, this.title, this.url);    

                //offsetCenter(myLatLng,-400,0,map);

                $(".dynamic").load(this.url + " .dynamic", function(response, status, xhr) {
                    $('.dynamic').fadeIn(500);
                    $('.dim').fadeIn(500);
                    $("#fountainG").fadeOut(250);
                });    
            });

            j++;
        }
4

1 に答える 1

0

私は答えを見つけたと思います。それはクロージャに関係しているようです。どのように修正されたのかは完全にはわかりませんが、ジオコーディング関数をネストされた関数に移動し、while ループ内で呼び出しました。最後まで実行されないため、一度実行されたら、配列を再度ループしてマップに追加する必要があります。コードは正常に動作しますが、残念ながらその理由はよくわかりません。

誰かがこれが機能する理由と、おそらくそれを設定するためのより良い方法についてチャイムを鳴らしてくれるとうれしいですが、それまでの間、これは次のように修正されています:

function initialize() {
function geocode() {
    var address = addressGlobal[j];
    var k = 0;        
    myLatLng = geocoder.geocode({ 'address': address }, function (results, status) {
    if (status == google.maps.GeocoderStatus.OK) 
    {
        while (k != posts) 
        {
            var lat = results[0].geometry.location.lat();
            var lng = results[0].geometry.location.lng();
            var myLatLng = new google.maps.LatLng(lat,lng);
            alert(lat + lng);

             place[k] = new google.maps.Marker({
            position: myLatLng,
            map: map,
            icon: image,
            url: postURL[k],
            title: postTitle[k]     
        });   

        google.maps.event.addListener(place[k], 'click', function() 
        {
            map.panTo(this.getPosition());
            map.setZoom(7);
            $("#fountainG").fadeIn(250);
            history.pushState(null, this.title, this.url);    

            //offsetCenter(myLatLng,-400,0,map);

            $(".dynamic").load(this.url + " .dynamic", function(response, status, xhr) 
            {
                $('.dynamic').fadeIn(500);
                $('.dim').fadeIn(500);
                $("#fountainG").fadeOut(250);
            });    
        });
        k++;
        }

    }  
else {
    alert('Geocode was not successful for the following reason: ' + status);
}
});
}

var geocoder = new google.maps.Geocoder();    
google.maps.visualRefresh = true;
    var mapOptions = {
        zoom: 5,
        center: new google.maps.LatLng(37.09024,-95.712891),
        disableDefaultUI: true,
    };

    var posts = locationLat.length;
    var j = 0;
    map = new google.maps.Map(document.getElementById("map-canvas"),
        mapOptions);

    var place = [];

        while (posts != j)
        {
            var image = server + '/location_marker.png';
            //var myLatLng = new google.maps.LatLng(locationLat[j],locationLong[j]);

            geocode();

            alert(myLatLng);                    


            j++;
        }

    //Determine if the user came in via the front page or a post so we can set the viewport correctly
    if ( entryPage == "post" )
    {
        map.setZoom(7);
        var postView = new google.maps.LatLng(postLocationLat, postLocationLong);
        map.panTo(postView);
    }
}
于 2013-08-08T04:16:49.397 に答える