Геокодирование API Google Maps синхронно

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

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

Ответ 1

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

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

Ответ 2

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

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

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" и сохранит ответ. наконец, форма отправляется клиентом script, включая два новых поля. На стороне сервера вы можете хранить их в БД.

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

Ответ 3

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

    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;
    });