How can I timeout a google maps geocoder via javas

2019-09-10 17:15发布

问题:

I am very new to javascript and I am having issues with timing out the geocoder requests. But I am stuck, I tries to add delays into loop, but seems like they don't work. If you can help, I would appreciarte it.

        <script type="text/javascript">

        function setLocationOnMap(locs) {
            var myOptions = {
                zoom: 4,
                center: new google.maps.LatLng(locs.lat(), locs.lng()),
                mapTypeId: google.maps.MapTypeId.ROADMAP          
            };
            var map = new google.maps.Map(document.getElementById('map_canvas'), myOptions); 

            var i=0;
            var total='<?php echo $counter ?>';

            for (i=0; i<total;i++){//adding cities to map by
                var city= document.the_form.elements[i].value;

                getLatLong2(city, map, setPointer);
            }                
        }

        function setPointer(map, address, locs2){
            var position = new google.maps.LatLng(locs2.lat(), locs2.lng());
            var marker = new google.maps.Marker({
                position: position,
                map: map
            });
            marker.setTitle(address);
        }


        function initialize() {
            var address = "Chicago IL";
            getLatLong(address, setLocationOnMap);
        }

        function getLatLong2(address, map, callback){
            var geo = new google.maps.Geocoder;
            geo.geocode({'address':address},function(results, status){
                if (status == google.maps.GeocoderStatus.OK) {
                    locs2 = results[0].geometry.location; 

                    callback(map, address, locs2);
                } else {
                    //alert("Geocode was not successful for the following reason: " + status);
                }
            });
        }



        function getLatLong(address, callback){
            var geo = new google.maps.Geocoder;
            geo.geocode({'address':address},function(results, status){
                if (status == google.maps.GeocoderStatus.OK) {
                    // processing...
                    locs = results[0].geometry.location; 
                    //pausecomp(10000);

                    callback(locs);
                } else {
                    //alert("Geocode was not successful for the following reason: " + status);
                }
            });
        }
    </script>

回答1:

When you submit the geocode request, you can start a timer in parallel and when the timer fires, you can declare the request to have timed out. The request will still continue, but you can ignore the results once it has timed out:

function getLatLong(address, callback){
    var timerId;
    var timedOut = false;

    var geo = new google.maps.Geocoder;
    geo.geocode({'address':address},function(results, status){
        if (timedOut) {
            // this request timed out, so ignore results
            return;
        } else {
            // this request succeeded, so cancel timer
            clearTimeout(timerId);
        }

        if (status == google.maps.GeocoderStatus.OK) {
            locs = results[0].geometry.location; 
            callback(locs);
        } else {
            //alert("Geocode was not successful for the following reason: " + status);
        }
    });

    timerId = setTimeout(function() {
        timedOut = true;
        alert('Request timed out.');
        // do something else
    }, 10000);
}