Как вернуть переменную из обратного вызова геокодера Google Maps JavaScript? - PullRequest
28 голосов
/ 08 июня 2010

Я работаю с API карт Google, и всякий раз, когда я возвращаю переменную в функцию initialize из функции codeLatLng, она утверждает, что она не определена. Если я распечатаю переменную из 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);
        }
      });
    }
  }

распечатывает неопределенный

Если я сделаю:

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

распечатывает Нью-Йорк, NY 10012, США

Ответы [ 5 ]

47 голосов
/ 08 июня 2010

Вы не можете вернуть значение из функции, значение еще не существует, когда функция возвращает.

Метод 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);
      }
    });
  }
}
11 голосов
/ 08 июня 2010

Вы делаете асинхронный запрос, ваша функция 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);
}
2 голосов
/ 25 августа 2018

Вы можете получить значение, используя localstorage.

 geocoder.geocode({
            'address': address,             
        }, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var latitude = results[0].geometry.location.lat();
                var longitude = results[0].geometry.location.lng();
            }                             
           localStorage.setItem("endlat", latitude);
           localStorage.setItem("endlng", longitude);
            });
var end_lat = localStorage.getItem("endlat");
var end_lng = localStorage.getItem("endlng");

Но он возвращает предыдущее значение .. Возвращает текущее значение, когда мы дважды щелкаем ...

0 голосов
/ 08 июня 2010

передать геокодер в качестве параметра функции codeLatLng ().

function codeLatLng(geocoder) {

вызовите это так в вашей функции инициализации:

var addr = codeLatLng(geocoder);
0 голосов
/ 08 июня 2010

Это возвращение не возвращается от codeLatLng; он возвращается из анонимной функции, передаваемой в geocoder.geocode.

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

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