#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 года спустя этот ответ все еще действителен. Спасибо!