1

だから私は昨日の午後からずっとこれに取り組んでいました。必要な結果を取得しようとしている基本的なコードのさまざまな反復を実行しました (xx ミリ秒ごとに順番にマーカーをドロップしたい) が、何も機能しません。私が得る結果は、それらが一度にすべて実行されるか、まったく実行されないかのどちらかです。「まったくない」問題は、私が修正して「一度に」取得した構文エラーが原因であると確信しています。

だからここに関数があります...

    function marker(location) 
    {

        geocoder = new google.maps.Geocoder();
        var latlng = new google.maps.LatLng(37.5, -98.35);
        var mapOptions = 
        {
            zoom: 5,
            center: latlng,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        }

        map = new google.maps.Map(document.getElementById('googleMap'), mapOptions);

        var infowindow = new google.maps.InfoWindow(), marker, i;

        for (i = 0; i < location.length; i++) 

        {


            marker = new google.maps.Marker(
            {
                position: new google.maps.LatLng(location[i][1], location[i][2]),
                animation: google.maps.Animation.DROP,
                map: map
            }
            );


            google.maps.event.addListener(marker, 'click', (function (marker, i) 
            {

                return function () 
                {
                    infowindow.setContent(location[i][0]);
                    infowindow.open(map, marker);
                }

            }
            )(marker, i));


        }

    }

私がすべきことは、このように for 内にあると思います...

        for (i = 0; i < location.length; i++) 

        {
           setTimeout(function() { 

            marker = new google.maps.Marker(
            {
                position: new google.maps.LatLng(location[i][1], location[i][2]),
                animation: google.maps.Animation.DROP,
                map: map
            }
            );


            google.maps.event.addListener(marker, 'click', (function (marker, i) 
            {

                return function () 
                {
                    infowindow.setContent(location[i][0]);
                    infowindow.open(map, marker);
                }

            }
            )(marker, i));
            }, 1000)
        }

しかし、これは機能しません。また、私が試した他のことも機能しません。私は多くの説明を見てきましたが、そのほとんどは理にかなっているように見えますが、これを理解することはできず、何よりも for ループに関するものだと思います。

例として、setTimeout 内に addlistener をカプセル化することも試みました。addlistener コードを実行して、それが機能するのを待つと考えました。ループから抜け出し、呼び出された関数が何かを返すのを待つ方法を考え出す必要があると思いますが、これを行う方法がわかりません。

誰かが私が正しい軌道に乗っているかどうかを教えてくれれば、私はそれを感謝します.

4

1 に答える 1

1

すべての結果を一度に取得したくない場合は、異なる時間を指定する必要があります。これは、ループが即座に実行され、すべてのタイムアウトがこの実行の時間から計算されるためです。

setTimeout(function() { 

}, 1000*i);

の同じ値を使用するすべての反復の問題を回避するにはi、次を使用してクロージャーで保護します

for (i = 0; i < location.length; i++) {
   (function(i){
       setTimeout(function() { 

       }, 1000*i);
   })(i);
}
于 2013-01-25T16:49:29.460 に答える