Rückgabewert einer verschachtelten Funktion in Javascript [duplicate]

Lesezeit: 4 Minuten

Ruckgabewert einer verschachtelten Funktion in Javascript duplicate
Chris Armstrong

Ich habe eine Funktion, die wie folgt eingerichtet ist

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

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

Nach meiner Logik sollte diese Warnung “foo” zurückgeben, aber stattdessen gibt sie undefiniert zurück. Was mache ich falsch?

AKTUALISIEREN: Hier ist mein tatsächlicher Code (es ist eine Funktion für Reverse-Geocoding mit der 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;
    });   
   }

1647173707 225 Ruckgabewert einer verschachtelten Funktion in Javascript duplicate
z33m

Sie müssen eine Funktion aufrufen, bevor sie etwas zurückgeben kann.

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

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

Oder:

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

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

für Ihren eigentlichen Code. Die Rückkehr sollte außerhalb, in der Hauptfunktion erfolgen. Der Callback wird irgendwo drinnen aufgerufen getLocations -Methode und daher wird ihr Rückgabewert nicht in Ihrer Hauptfunktion empfangen.

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
   }

  • Ich habe meine Frage mit dem tatsächlichen Code aktualisiert. Das Problem, das ich habe, ist, dass ich mit der Google-API arbeite und meine Unterfunktion von einer ihrer Funktionen aufgerufen wird. Irgendwelche Ideen, wie ich es umgehen könnte?

    – Chris Armstrong

    10. April 2010 um 2:31 Uhr

  • Danke. Das Problem dabei ist, dass, wenn ich einfach Rückkehrland sage; es gibt ” ” zurück, da ich die Informationen normalerweise nicht schnell genug von Google zurückerhalten habe. Gibt es eine Möglichkeit, zu warten, bis sich der Wert ändert?

    – Chris Armstrong

    10. April 2010 um 2:41 Uhr

  • @chris Ich denke, der bessere Weg, diese APIs zu verwenden, besteht darin, Ihre Logik (die Dinge, die Sie mit dem Land, der Adresse usw. tun möchten) in den Rückruf einzufügen.

    – z33m

    10. April 2010 um 2:50 Uhr


  • Sie haben meine Lieblingsalternative verpasst return (funtion(){...})();

    – James Khoury

    8. Juni 2011 um 0:55 Uhr

  • getLocations ist asynchron. Dieser Code kann nicht funktionieren.

    – Bergi

    28. Oktober 2016 um 11:32 Uhr

Ruckgabewert einer verschachtelten Funktion in Javascript duplicate
Markus Bessey

Rechts. Die Funktion, die Sie an getLocations() übergeben, wird nicht aufgerufen, bis die Daten verfügbar sind, daher hilft Ihnen die Rückgabe von “country” nicht, bevor es festgelegt wurde.

Dazu muss die Funktion, die Sie an geocoder.getLocations() übergeben, mit den zurückgegebenen Werten tatsächlich das tun, was Sie möchten.

Etwas wie das:

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

Wenn Sie jedes Mal, wenn Sie den Standort erhalten, etwas anderes tun möchten, übergeben Sie die Funktion als zusätzlichen Parameter an 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);

Wenn dies ein wenig chaotisch aussieht, können Sie sich etwas wie die Deferred-Funktion in Dojo ansehen, die die Verkettung zwischen Funktionen etwas klarer macht.

  • Danke, das Problem, das ich habe, ist jedoch, dass ich den reverseGeocode mehrmals in meinem Code verwenden möchte. Ich habe eine Liste mit Statusaktualisierungen und ihren Standorten, die von der Twitter-API zurückgegeben werden, und möchte daher für jede davon reverseGeocode aufrufen. Außerdem möchte ich reverseGeocode für den Standort des aktuellen Benutzers aufrufen. Ich bin mir nicht sicher, ob das Sinn macht … die Seite ist unter chris-armstrong.com/whispers wenn Sie einen Blick darauf werfen und sehen wollen, was ich meine

    – Chris Armstrong

    10. April 2010 um 14:38 Uhr

  • Verwenden Sie im Zweifelsfall mehr Funktionen:-) Siehe Änderungen oben …

    – Markus Bessey

    11. April 2010 um 1:50 Uhr

1647173709 545 Ruckgabewert einer verschachtelten Funktion in Javascript duplicate
Ericjam

Nur zu Ihrer Information, Geocoder ist asynchron, daher funktioniert die akzeptierte Antwort, obwohl sie logisch ist, in diesem Fall nicht wirklich. Ich hätte lieber ein externes Objekt, das als Ihr Updater fungiert.

var updater = {};

function geoCodeCity(goocoord) { 
    var geocoder = new google.maps.Geocoder();
    geocoder.geocode({
        'latLng': goocoord
    }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            updater.currentLocation = results[1].formatted_address;
        } else {
            if (status == "ERROR") { 
                    console.log(status);
                }
        }
    });
};

997540cookie-checkRückgabewert einer verschachtelten Funktion in Javascript [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy