Как назначить этот запрос геокода переменной?

#javascript #google-maps

#javascript #google-карты

Вопрос:

Я пытаюсь использовать геокод Google maps для преобразования этой адресной строки в объект LatLng. Я полагаю, что, поскольку это асинхронный вызов, latlng присваивается значение null. Что я могу сделать, чтобы назначение переменной работало так, как я хочу?

 var latlng = codeAddress(address)
alert("Lat/lng is: "   latlng);

function codeAddress(address) {
      geocoder.geocode( {'address':address}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
          return results[0].geometry.location;
        } else {
          alert("Geocode failed due to: "   status);
        }
      }); 
    }
  

Ответ №1:

Поскольку geocode() он асинхронный, как вы также упоминаете, нет способа вызвать его синхронно. Итак, var latlng = codeAddress(address); это невозможно. Вам нужно использовать результат геокодирования внутри самой функции. Рассмотрим:

 var latlng = null;
function codeAddress(address) {
      geocoder.geocode( {'address':address}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
          latlng = results[0].geometry.location; // use latlng here ..., e.g.:
          alert("Lat/lng is: "   latlng);
        } else {
          alert("Geocode failed due to: "   status);
        }
      }); 
    }
  

Вызов codeAddress(address) присваивает значение глобальной переменной latlng . Однако проблема в том, что вы не знаете, когда произойдет присвоение. В приведенном выше случае вы бы узнали только после появления окна предупреждения.

Общий подход заключается в обработке результата геокодирования внутри обратного вызова, например, для использования результата для заполнения HTML-поля.

Комментарии:

1. Спасибо за ваш ответ. Что я пытаюсь сделать, так это отобразить карту Google, если код состояния выполнен успешно, в противном случае я вообще не буду отображать карту. Есть ли способ заблокировать функцию / назначение javascript до завершения работы другой? Или, возможно, мне нужно сделать это по-другому?

2. Вы можете вызвать свою функцию внутри обратного вызова геокода, т. е. вместо alert(latlng) вызова вашего render(latlng) .

3. 3 года спустя этот ответ все еще действителен. Спасибо!