Ich schaue mir dieses Beispiel aus Angulars Dokumenten an, $q
aber ich denke, dass dies wahrscheinlich für Versprechen im Allgemeinen gilt. Das folgende Beispiel wird wörtlich aus ihren Dokumenten kopiert, wobei der Kommentar enthalten ist:
promiseB = promiseA.then(function(result) {
return result + 1;
});
// promiseB will be resolved immediately after promiseA is resolved and its value
// will be the result of promiseA incremented by 1
Mir ist nicht klar, wie das funktioniert. Wenn ich .then()
auf das Ergebnis des ersten .then()
zurückgreifen kann, indem ich sie verkette, von dem ich weiß, dass ich es kann, dann promiseB
ist es ein Versprechungsobjekt vom Typ Object
. Es ist kein Number
. Was meinen sie also mit "sein Wert wird das Ergebnis von Versprechen sein, das um 1 erhöht wird"?
Soll ich so promiseB.value
oder so darauf zugreifen ? Wie kann der Erfolgsrückruf ein Versprechen zurückgeben UND "Ergebnis + 1" zurückgeben? Ich vermisse etwas.
javascript
angularjs
promise
angular-promise
temporärer_Benutzername
quelle
quelle
Antworten:
promiseA
Diethen
Funktion von 'gibt ein neues Versprechen (promiseB
) zurück, das sofort aufgelöst wird, nachdempromiseA
es aufgelöst wurde. Sein Wert ist der Wert dessen, was von der darin enthaltenen Erfolgsfunktion zurückgegeben wirdpromiseA
.In diesem Fall
promiseA
wird mit einem Wert aufgelöst -result
und dann sofortpromiseB
mit dem Wert von aufgelöstresult + 1
.Der Zugriff auf den Wert von
promiseB
erfolgt auf die gleiche Weise, wie wir auf das Ergebnis von zugegriffen habenpromiseA
.Edit Dezember 2019 :
async
/await
ist jetzt Standard in JS, was eine alternative Syntax zu dem oben beschriebenen Ansatz ermöglicht. Sie können jetzt schreiben:Jetzt gibt es kein VersprechenB, da wir das Ergebnis von VersprechenA mit ausgepackt
await
haben und Sie direkt damit arbeiten können.Allerdings
await
kann nur innerhalb einer verwendet werdenasync
Funktion. Um etwas herauszuzoomen, müsste das Obige wie folgt enthalten sein:quelle
Wenn ein Versprechen gelöst / abgelehnt wird, ruft es seinen Erfolgs- / Fehlerbehandler auf:
Die
then
Methode gibt auch ein Versprechen zurück: VersprechenB, das abhängig vom Rückgabewert des Erfolgs- / Fehlerbehandlers von VersprechenA aufgelöst / abgelehnt wird .Es gibt drei mögliche Werte, die die Erfolgs- / Fehlerbehandlungsroutinen von VersprechenA zurückgeben können und die sich auf das Ergebnis von VersprechenB auswirken:
Mit diesem Verständnis können Sie Folgendes verstehen:
Der Then-Aufruf gibt Versprechen B sofort zurück. Wenn versprechenA gelöst ist, gibt es das Ergebnis an den Erfolgsbearbeiter von versprechenA weiter. Da der Rückgabewert das Ergebnis + 1 von VersprechenA ist, gibt der Erfolgshandler einen Wert zurück (Option 2 oben), sodass VersprechenB sofort aufgelöst wird und das Erfolgshandler von VersprechenB das Ergebnis + 1 von VersprechenA übergeben wird.
quelle
.then
Funktion von VersprechenB erhält, was von zurückgegeben wird.then
Funktion von VersprechenA zurückgegeben wird.Hier gibt VersprechenA eine Zahl zurück, die als
number
Parameter für die Erfolgsfunktion von VersprechenB verfügbar sein wird. die dann um 1 erhöht wirdquelle
Das Analysieren des Kommentars ein wenig anders als Ihr derzeitiges Verständnis könnte helfen:
Dies besagt, dass dies
promiseB
ein Versprechen ist, aber sofort nach derpromiseA
Lösung gelöst wird. Eine andere Sichtweise bedeutet, dasspromiseA.then()
ein Versprechen zurückgegeben wird, das zugewiesen istpromiseB
.Dies bedeutet, dass der
promiseA
aufgelöste Wert der Wert ist,promiseB
der als successCallback-Wert erhalten wird:quelle
Die Antwort auf Pixelbits ist korrekt und Sie sollten immer verwenden,
.then()
um auf den Wert eines Versprechens im Produktionscode zuzugreifen.Es gibt jedoch eine Möglichkeit, direkt nach dem Auflösen auf den Wert des Versprechens zuzugreifen, indem die folgende nicht unterstützte interne node.js-Bindung verwendet wird:
WARNUNG: process.binding sollte niemals außerhalb des Kerns von nodejs verwendet werden, und das Kernteam von nodejs versucht aktiv, es zu verwerfen
https://github.com/nodejs/node/pull/22004 https://github.com/nodejs/node/issues/22064
quelle
Dieses Beispiel finde ich selbsterklärend. Beachten Sie, wie das Warten auf das Ergebnis wartet und Sie das zurückgegebene Versprechen verpassen.
quelle
quelle
Sie können dies einfach mit einer asynchronen Wartemethode in Javascript tun.
Unten finden Sie ein Beispiel für das Abrufen eines WebRTC-Versprechenswerts mithilfe eines Timeouts.
quelle
Um in der Knoten-REPL eine DB-Verbindung zu erhalten, die den Wert eines Versprechens hat, habe ich den folgenden Ansatz gewählt:
Die Zeile mit
await
würde normalerweise ein Versprechen zurückgeben. Dieser Code kann in den Node REPL eingefügt oder, wenn er darin gespeichertindex.js
ist, in Bash with ausgeführt werdenDadurch bleiben Sie im Knoten REPL, nachdem Sie das Skript mit Zugriff auf die festgelegte Variable ausgeführt haben. Um zu bestätigen, dass die asynchrone Funktion zurückgegeben wurde, können Sie
connection
beispielsweise protokollieren und dann die Variable verwenden. Man möchte natürlich noch nicht damit rechnen, dass die asynchrone Funktion für Code im Skript außerhalb der asynchronen Funktion aufgelöst wird.quelle
Es gibt oben einige gute Antworten und hier ist die Version der ES6-Pfeilfunktion
quelle
Ich lerne langsam Javascript-Versprechen. Standardmäßig geben alle asynchronen Funktionen ein Versprechen zurück. Sie können Ihr Ergebnis wie folgt verpacken:
" Der Ausdruck" Warten " bewirkt, dass die Ausführung der asynchronen Funktion angehalten wird, bis ein Versprechen erfüllt ist (dh erfüllt oder abgelehnt wurde), und die Ausführung der asynchronen Funktion nach Erfüllung wieder aufgenommen wird. Bei Wiederaufnahme entspricht der Wert des Ausdrucks" Warten "dem des erfüllten Versprechens Wenn das Versprechen abgelehnt wird, löst der Ausdruck wait den abgelehnten Wert aus . "
Weitere Informationen zu Wartezeiten und Versprechungen finden Sie unter MDN Web Docs
quelle
Vielleicht hilft dieses kleine Typescript-Codebeispiel.
Hier
repository.get(id)
kehrt die a zurückPromise<Account>
. Ich ordne es der Variablenaccount
innerhalb derthen
Anweisung zu.quelle