Wie gibt man einen Wert von einer asynchronen Callback-Funktion zurück? [duplicate]

Lesezeit: 3 Minuten

Wie gibt man einen Wert von einer asynchronen Callback Funktion zuruck
Gowri

Diese Frage wird in SO oft gestellt. Aber ich kann immer noch nichts bekommen.

Ich möchte einen gewissen Wert aus dem Rückruf ziehen. Schauen Sie sich das Skript unten zur Verdeutlichung an.

function foo(address){

      // google map stuff
      geocoder.geocode( { 'address': address}, function(results, status) {
          results[0].geometry.location; // I want to return this value
      })

    }
    foo(); //result should be results[0].geometry.location; value

Wenn ich versuche, diesen Wert zurückzugeben, wird er nur “undefiniert”. Ich habe einige Ideen von SO befolgt, schlägt aber immer noch fehl.

Jene sind:

function foo(address){
    var returnvalue;    
    geocoder.geocode( { 'address': address}, function(results, status) {
        returnvalue = results[0].geometry.location; 
    })
    return returnvalue; 
}
foo(); //still undefined

  • Jeder, der hierher gekommen ist Bitte lesen Sie zuerst diese Frage. Es erklärt, wie man dieses Problem effektiv angeht.

    – Benjamin Grünbaum

    4. August 2014 um 10:57 Uhr

  • Warum bleibt meine Variable unverändert, nachdem ich sie innerhalb einer Funktion geändert habe? – Asynchrone Codereferenz bietet auch eine allgemeinere, detailliertere Erläuterung des vorliegenden Problems.

    – Qantas 94 Schwer

    8. Februar 2015 um 3:05 Uhr

  • Verwenden Sie Q oder eine seiner Varianten, wie die $q-Bibliothek, die mit angleJs geliefert wird. Und schaue niemals zurück. Asynchrone Funktionen geben sofort undefiniert zurück. Verschwenden Sie also niemals Ihre Zeit damit, Dinge auf undefined zu tun. Verwenden Sie außerdem niemals das Schlüsselwort „return“ in Ihren asynchronen Funktionen, wie Sie es normalerweise tun. Verwenden Sie stattdessen zurückgestellte Zusagen. deferred.resolve(STUFF you want to do) , dann können Sie das später einfach zurückgeben ,’return deferred.promise; ‘. 🙂

    – ISONecroMAN

    13. August 2016 um 14:41 Uhr

  • Verwenden Sie Deasync wie folgt: stackoverflow.com/a/47051880/2083877

    – Sunil Kumar

    8. September 2021 um 11:26 Uhr

1641793856 314 Ausschliesen von Debug JavaScript Code wahrend der Minimierung
Sean Kinsey

Dies ist unmöglich, da Sie nicht von einem asynchronen Aufruf innerhalb einer synchronen Methode zurückkehren können.

In diesem Fall müssen Sie einen Rückruf an foo übergeben, der den Rückgabewert erhält

function foo(address, fn){
  geocoder.geocode( { 'address': address}, function(results, status) {
     fn(results[0].geometry.location); 
  });
}

foo("address", function(location){
  alert(location); // this is where you get the return value
});

Die Sache ist, wenn ein innerer Funktionsaufruf asynchron ist, dann müssen alle Funktionen, die diesen Aufruf “verpacken”, auch asynchron sein, um eine Antwort “zurückzugeben”.

Wenn Sie viele Rückrufe haben, sollten Sie den Sprung wagen und a verwenden Promise-Bibliothek wie Q.

  • 🙂 Es ist nicht stark, es ist einfach so. Sobald Sie eine asynchrone Methode verwenden, um Daten zu übergeben, wird die gesamte Funktionskette asynchron.

    – Sean Kinsey

    27. Juli 2011 um 16:31 Uhr

  • Upvote dafür, dass dies endlich Sinn macht.

    – Steven Matthews

    13. Februar 2015 um 19:28 Uhr

  • “Sie können keinen asynchronen Aufruf innerhalb einer synchronen Methode verwenden.” – Ja, du kannst. Sie können das Ergebnis des asynchronen Aufrufs einfach nicht innerhalb derselben synchronen Methode verwenden.

    – nnnnn

    7. Juli 2016 um 22:48 Uhr

  • @Sean Kinsey, kannst du mir sagen, wie ich auf die Standortvariable außerhalb der Funktion foo() zugreifen kann?

    – Yasin Patel

    29. August 2016 um 7:39 Uhr

  • Damit das klar ist, können Sie den Wert dieser Variablen nicht so “zurückgeben”, wie PHP ihn zurückgibt. Wir übergeben im Grunde das Ergebnis einer Callback-Funktion an eine andere Callback-Funktion. Es gibt immer noch keine externe Variable, die das Ergebnis tatsächlich enthält …

    – Robert Sinclair

    27. Juni 2018 um 1:38 Uhr

1646865307 80 Wie gibt man einen Wert von einer asynchronen Callback Funktion zuruck
Spitz

Es macht keinen Sinn, Werte von einem Callback zurückzugeben. Führen Sie stattdessen die “foo()”-Arbeit aus, die Sie erledigen möchten Innerhalb Ihr Rückruf.

Asynchrone Rückrufe werden vom Browser oder von einem Framework wie der Google-Geocodierungsbibliothek aufgerufen, wenn Ereignisse eintreten. Es gibt keinen Platz für zurückgegebene Werte. Eine Callback-Funktion kann mit anderen Worten einen Wert zurückgeben, aber der Code, der die Funktion aufruft, achtet nicht auf den Rückgabewert.

Wenn Sie jQuery verwenden, sollten Sie dies vielleicht ausprobieren:
http://api.jquery.com/category/deferred-object/

Es ermöglicht Ihnen, die Ausführung Ihrer Callback-Funktion aufzuschieben, bis die Ajax-Anforderung (oder eine asynchrone Operation) abgeschlossen ist. Dies kann auch verwendet werden, um einen Rückruf aufzurufen, nachdem mehrere Ajax-Anforderungen alle abgeschlossen wurden.

984780cookie-checkWie gibt man einen Wert von einer asynchronen Callback-Funktion zurück? [duplicate]

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

Privacy policy