Как вернуть переменную из обратного вызова геокодирования Google Maps JavaScript?
Я работаю с API карт google и всякий раз, когда возвращаю переменную функции инициализации из функции codeLatLng, она утверждает undefined. Если я напечатаю переменную из codeLatLng, она будет выглядеть нормально.
var geocoder;
function initialize() {
geocoder = new google.maps.Geocoder();
var latlng = new google.maps.LatLng(40.730885,-73.997383);
var addr = codeLatLng();
document.write(addr);
}
function codeLatLng() {
var latlng = new google.maps.LatLng(40.730885,-73.997383);
if (geocoder) {
geocoder.geocode({'latLng': latlng}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
if (results[1]) {
return results[1].formatted_address;
} else {
alert("No results found");
}
} else {
alert("Geocoder failed due to: " + status);
}
});
}
}
выводит undefined
Если я это сделаю:
var geocoder;
function initialize() {
geocoder = new google.maps.Geocoder();
var latlng = new google.maps.LatLng(40.730885,-73.997383);
codeLatLng();
}
function codeLatLng() {
var latlng = new google.maps.LatLng(40.730885,-73.997383);
if (geocoder) {
geocoder.geocode({'latLng': latlng}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
if (results[1]) {
document.write(results[1].formatted_address);
} else {
alert("No results found");
}
} else {
alert("Geocoder failed due to: " + status);
}
});
}
}
распечатывает Нью-Йорк, Нью-Йорк 10012, США
Ответы
Ответ 1
Вы не можете вернуть значение из функции, это значение еще не существует, когда функция возвращается.
Метод geocode
делает асинхронный вызов и использует обратный вызов для обработки результата, поэтому вы должны сделать то же самое в функции codeLatLng
:
var geocoder;
function initialize() {
geocoder = new google.maps.Geocoder();
var latlng = new google.maps.LatLng(40.730885,-73.997383);
codeLatLng(function(addr){
alert(addr);
});
}
function codeLatLng(callback) {
var latlng = new google.maps.LatLng(40.730885,-73.997383);
if (geocoder) {
geocoder.geocode({'latLng': latlng}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
if (results[1]) {
callback(results[1].formatted_address);
} else {
alert("No results found");
}
} else {
alert("Geocoder failed due to: " + status);
}
});
}
}
Ответ 2
Вы делаете асинхронный запрос, ваша функция codeLatLng()
завершена и возвращается задолго до завершения геокодирования.
Если вам нужны данные геокодера, чтобы продолжить, вам нужно будет объединить свои функции вместе:
function initialize() {
geocoder = new google.maps.Geocoder();
codeLatLng();
}
function codeLatLng() {
var latlng = new google.maps.LatLng(40.730885,-73.997383);
if (geocoder) {
geocoder.geocode({'latLng': latlng}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
if (results[1]) {
initContinued(results[1].formatted_address);
} else {
alert("No results found");
}
} else {
alert("Geocoder failed due to: " + status);
}
});
}
}
function initContinued(addr) {
alert(addr);
}
Ответ 3
Функция geocode
использует обратный вызов (function(results, status) { ... }
), который вызывается, когда функция geocode
завершает свою работу. Таким образом, когда вы возвращаете значение из этого обратного вызова, оно возвращает его только в функцию geocode
, а не из codeLatLng
.
С этим у вас есть несколько вариантов: Определите переменную в codeLatLng
и установите ее в функции обратного вызова, например:
function codeLatLng()
{
var returnValue;
geocoder.geocode({'latLng': latlng}, function(results, status) { returnValue = results[1].formatted_address });
return returnValue;
}
Или сделайте то, что вам нужно, с результатом непосредственно в функции обратного вызова. Или поместите результат в глобальную переменную. (Кроме того, если функция geocode
является асинхронной - если она немедленно возвращается и обратный вызов вызывается впоследствии, вам нужно сделать одно из двух последних, вы не можете вернуть значение из codeLatLng
в этом случае.)
Ответ 4
передать геокодер в качестве параметра функции codeLatLng().
function codeLatLng(geocoder) {
вызовите его так, как показано в вашей функции инициализации:
var addr = codeLatLng(geocoder);
Ответ 5
Этот возврат не возвращается из codeLatLng
; он возвращается из анонимной функции, передаваемой в geocoder.geocode
.
Я думаю, вам нужно будет передать данные, используя другой механизм, например. глобальная переменная