0

JavaScriptでGoogleサービスを複数回呼び出しています。

すべての応答を取得するまで、JavaScript の実行を停止したいと考えています。

<script type="text/javascript">
    var schools =
    [
        'Abelsvej 98, 4100, Ringsted',
        'Almstoftevej 71, 4100, Ringsted',
        'Balstrupvej 35, 4100, Ringsted',
        'Ejlstrupvej 101, 4100, Ringsted',
        'Ejlstrupvej 101 C 101, 4100, Ringsted',
        'Ejlstrupvej 90 90, 4100, Ringsted',
        'Haraldsvej 7 7, 4100, Ringsted',
        'Løngangen 43 65, 4100, Ringsted',
        'Vetterslev Bygade 21 21, 4100, Ringsted',
        'Østergade 25, Høm 25, 4100, Ringsted',
        'Østergade 3, høm 3, 4100, Ringsted'
    ];


for (var r = 0; r < schools.length; r++) {

                (function (r) {
                    var address = schools[r][1];
                    var geocoder = new google.maps.Geocoder();
                    setTimeout(function () {
                        geocoder.geocode({ 'address': address }, function (results, status) {
                            if (status == google.maps.GeocoderStatus.OK) {
                                var location = results[0].geometry.location;
                                schoolsArray[r] = location.lat() + ', ' + location.lng();
                            }
                        });
                    }
                    , 1000 * (r + 1));
                }(r));

// other javascript stuff

</script>

すべての応答が到着するまで、javascript が先に進まないようにしてください。

4

1 に答える 1

0

ここで経験しているのは、非同期リクエストと同期 JavaScript 方法論の違いです。

Google へのリクエストには時間がかかる可能性があるため、メソッドの 2 番目のパラメーターとしてコールバックがあることがわかりますgeocode()

これを行う最善の方法は、返された応答の数を数えることです。コールバック メソッドで、すべての応答があるときに実行する残りの JavaScript を実行する関数を追加できます。応答を返します。

すべての JavaScript の実行を停止する方法はありません。すべてのジオコード レスポンスを取得したときに一部のコードを実行するように指示するだけです。

なぜsetTimeout()あなたのコードにも があるのか​​ わかりません。

<script type="text/javascript">
    var schools =
    [
        'Abelsvej 98, 4100, Ringsted',
        'Almstoftevej 71, 4100, Ringsted',
        'Balstrupvej 35, 4100, Ringsted',
        'Ejlstrupvej 101, 4100, Ringsted',
        'Ejlstrupvej 101 C 101, 4100, Ringsted',
        'Ejlstrupvej 90 90, 4100, Ringsted',
        'Haraldsvej 7 7, 4100, Ringsted',
        'Løngangen 43 65, 4100, Ringsted',
        'Vetterslev Bygade 21 21, 4100, Ringsted',
        'Østergade 25, Høm 25, 4100, Ringsted',
        'Østergade 3, høm 3, 4100, Ringsted'
    ];

var count = 0;

for (var r = 0; r < schools.length; r++) {
    (function (r) {
        var address = schools[r][1];
        var geocoder = new google.maps.Geocoder();
        setTimeout(function () {
            geocoder.geocode({ 'address': address }, function (results, status) {
                if (status == google.maps.GeocoderStatus.OK) {
                    var location = results[0].geometry.location;
                    schoolsArray[r] = location.lat() + ', ' + location.lng();
                    count++;
                    if(count == schools.length){
                        doMoreJS();
                    }
                }
            });
        }
        , 1000 * (r + 1));
    }(r));
}

function doMoreJS(){
    // Do more JS
}

</script>
于 2013-04-14T18:28:03.487 に答える