Возвращаемое значение от вложенной функции в JavaScript [дубликат]

Этот вопрос уже имеет ответ здесь:

У меня есть функция, которая настраивается следующим образом

function mainFunction() {
      function subFunction() {
            var str = "foo";
            return str;
      }
}

var test = mainFunction();
alert(test);

К моей логике то предупреждение должно возвратить 'нечто', но вместо этого это возвращается неопределенный. Что я делаю неправильно?

ОБНОВЛЕНИЕ: вот мой фактический код (это - функция для геокодирования реверса с Google API),

function reverseGeocode(latitude,longitude){
    var address = "";
    var country = "";
    var countrycode = "";
    var locality = "";

    var geocoder = new GClientGeocoder();
    var latlng = new GLatLng(latitude, longitude);

     return geocoder.getLocations(latlng, function(addresses) {
     address = addresses.Placemark[0].address;
     country = addresses.Placemark[0].AddressDetails.Country.CountryName;
     countrycode = addresses.Placemark[0].AddressDetails.Country.CountryNameCode;
     locality = addresses.Placemark[0].AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;
     return country;
    });   
   }
54
задан Chris Armstrong 9 April 2010 в 15:24
поделиться

2 ответа

вы должны вызвать функцию, прежде чем она сможет что-либо вернуть.

function mainFunction() {
      function subFunction() {
            var str = "foo";
            return str;
      }
      return subFunction();
}

var test = mainFunction();
alert(test);

Или:

function mainFunction() {
      function subFunction() {
            var str = "foo";
            return str;
      }
      return subFunction;
}

var test = mainFunction();
alert( test() );

для вашего фактического кода. Возврат должен быть снаружи, в основной функции. Обратный вызов вызывается где-то внутри метода getLocations и, следовательно, его возвращаемое значение не принимается внутри вашей основной функции.

function reverseGeocode(latitude,longitude){
    var address = "";
    var country = "";
    var countrycode = "";
    var locality = "";

    var geocoder = new GClientGeocoder();
    var latlng = new GLatLng(latitude, longitude);

    geocoder.getLocations(latlng, function(addresses) {
     address = addresses.Placemark[0].address;
     country = addresses.Placemark[0].AddressDetails.Country.CountryName;
     countrycode = addresses.Placemark[0].AddressDetails.Country.CountryNameCode;
     locality = addresses.Placemark[0].AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;
    });   
    return country
   }
60
ответ дан 7 November 2019 в 08:07
поделиться

Верно. Функция, которую вы передаете в getLocations (), не будет вызываться до тех пор, пока данные не станут доступны, поэтому возврат «страны» до того, как она была установлена, вам не поможет.

Для этого нужно, чтобы функция, которую вы передаете в geocoder.getLocations (), действительно делала все, что вы хотите, с возвращаемыми значениями.

Примерно так:

function reverseGeocode(latitude,longitude){
  var geocoder = new GClientGeocoder();
  var latlng = new GLatLng(latitude, longitude);

  geocoder.getLocations(latlng, function(addresses) {
    var address = addresses.Placemark[0].address;
    var country = addresses.Placemark[0].AddressDetails.Country.CountryName;
    var countrycode = addresses.Placemark[0].AddressDetails.Country.CountryNameCode;
    var locality = addresses.Placemark[0].AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;
    do_something_with_address(address, country, countrycode, locality);
  });   
}

function do_something_with_address(address, country, countrycode, locality) {
  if (country==="USA") {
     alert("USA A-OK!"); // or whatever
  }
}

Если вы хотите делать что-то новое каждый раз, когда получаете местоположение, то передайте функцию в качестве дополнительного параметра в reverseGeocode:

function reverseGeocode(latitude,longitude, callback){
  // Function contents the same as above, then
  callback(address, country, countrycode, locality);
}
reverseGeocode(latitude, longitude, do_something_with_address);

Если это выглядит немного запутанным, вы можете взять взглянем на что-то вроде функции Deferred в Dojo, которая делает цепочку между функциями немного более ясной.

3
ответ дан 7 November 2019 в 08:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: