Подтвердить что ты не робот

Как вернуть переменную из обратного вызова геокодирования 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, США

4b9b3361

Ответ 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.

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