Google Maps API Geocode Синхронно - PullRequest
       16

Google Maps API Geocode Синхронно

11 голосов
/ 21 августа 2009

Мне было интересно, можно ли геокодировать что-то с помощью googlemaps api синхронно, поэтому вместо ожидания вызова функции обратного вызова она будет ожидать возврата значения. Кто-нибудь нашел способ сделать что-то подобное?

P.S .: Я использую версию 3 API

Ответы [ 3 ]

7 голосов
/ 12 сентября 2010

Да, то, что вы пытаетесь достичь, возможно, хотя синхронный запрос не нужен.

Посмотрите на этот код

function StoreGeo()
 {
        var address =  $('input[name=zipcode]').val() + ', ' + $('input[name=city]').val();
 geocoder.geocode( { 'address': address}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        var ll = results[0].geometry.location.toString();

            llarr = ll.replace(/[\(\) ]/g, '').split(',');

                for(i = 0; i < llarr.length;i++)
                {
                    $('#form').append($('<input type="hidden" name="'+(i == 0 ? 'lat' : 'long')+'">').val(llarr[i]));
                }

                $('#form').submit();
      } 
      else
      {
        alert(status);
      }
    });

    $('#form').unbind('submit');
    return false;
 }

$(document).ready(function () { 

    //init maps
    geocoder = new google.maps.Geocoder();

    $('#form').bind('submit',function() {
        StoreGeo();
    });

}); 

Итак, прикрепите обработчик отправки к форме, когда он будет отправлен, выполните гео-запрос на основе информации об адресе из вашей формы. Но в то же время отложите отправку, вернув false в обработчике. Обработчик ответа создаст 2 скрытых текстовых поля 'lat' и 'long' и сохранит ответ. наконец форма отправляется клиентским скриптом, включая два новых поля. На стороне сервера вы можете хранить их в БД.

!! Обратите внимание, что это возможно, но, вероятно, противоречит условиям Google, как указано выше.

2 голосов
/ 21 августа 2009

Геокодер вызывает вашу функцию обратного вызова со значением. Это единственный способ сделать это. Если бы он был синхронным, ваш скрипт остановился бы, ожидая обработки геокода. На самом деле нет никаких причин делать это так.

Что именно вы пытаетесь достичь?

1 голос
/ 01 июня 2016

Я просто использую флаг во время отправки формы, чтобы знать, когда передача должна пройти или когда она должна ждать геокодирования. Когда геокодирование будет выполнено, он снова отправит форму.

    var hasGeocoded = false;

    searchFrom.on('submit', function(){
        //If not geocoded yet
        if (!hasGeocoded) {
            var geocoder = new google.maps.Geocoder();
            var location = locationEl.val();
            geocoder.geocode({'address': location}, function (results, status) {
                hasGeocoded = true;

                if (status == google.maps.GeocoderStatus.OK) {
                    $('#coords').val(
                        results[0].geometry.location.lat() + ',' + results[0].geometry.location.lng()
                    );
                }

                searchFrom.submit();
            });

            return false; //wait for geocoder to finish and re-submit the form
        }

        return true;
    });
...