Wie gibt man einen Wert von einer asynchronen Callback-Funktion zurück? [duplicate]
Lesezeit: 3 Minuten
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.
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
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
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.
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.
9847800cookie-checkWie gibt man einen Wert von einer asynchronen Callback-Funktion zurück? [duplicate]yes
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