Wie zum extrahieren von Daten aus einem Versprechen
Habe ich ein Versprechen, dass die Daten liefert und ich wollen speichern Sie in Variablen. Ist diese unmöglich in JavaScript wegen der asynchronen Natur und brauche ich onResolve
als callback?
Kann ich die irgendwie verwenden (z.B. wickeln Sie es mit async/await):
const { foo, bar } = Promise.then(result => result.data, errorHandler);
//rest of script
stattdessen?
Promise.then(result => {
const { foo, bar } = result.data;
//rest of script
}, errorHandler);
Hinweis: Bluebird-Bibliothek anstelle der nativen Implementierung, und ich kann nicht ändern, von Versprechen, asnyc/erwarten oder Generatoren.
- Es ist möglich, mit javascript. Sie können die Zuordnung der Daten erhalten Sie auf Erfolg Versprechen, um die variable, die Sie zuvor deklariert. Und eine variable haben, die den Wert von Versprechen. Sie können finden: developer.mozilla.org/en/docs/Web/JavaScript/Reference/...
async/ await
kommen!- Dies ist möglich, kann aber verursachen Fehler, da JavaScript nicht warten, bis die Versprechen zu lösen. Auch ändern müssen
const
zulet
, die Nebenwirkungen haben können. - Nur zur info,
errorHandler
nicht wirklich behandeln, ein Fehler hier, es wird unmittelbar nur - Diese syntax ist in Ordnung arbeiten mit der bluebird.js Umsetzung. Siehe bluebird-API-Referenz Es ist auch richtig laut Promises/A+ - standard (siehe Absatz 2.2)
- Es sei denn
errorHandler
sich selbst gibt eine Funktion, all das wird hier passieren ist, dass der Rückgabewert vonerrorHandler
verabschiedet werden, um dierejectedHandler
parameter. Sie würde übergeben müssenerrorHandler
als Referenz an die Funktion:Promise.then(result => result.data, errorHandler);
- Mögliche Duplikate von Wie man den Wert zuzugreifen, der an ein Versprechen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
NEIN, Sie können nicht erhalten die Daten synchron aus einem Versprechen, wie Sie vorschlagen, in deinem Beispiel. Die Daten müssen innerhalb einer callback-Funktion. Alternativ in der funktionalen Programmierung Stil, den die Daten Versprechen, könnte sein anzeigen()ed") über.
Wenn Sie sind OK mit async/await (Sie sollten es ist genial), dann können Sie code schreiben, sieht synchron sind und dennoch die Asynchronität von ein Versprechen (siehe @loganfsmyth Kommentare).
Insgesamt, da Sie bereits ES6 ich nehme an, Sie sind auch mit einem transpiler. In diesem Fall sollten Sie auf jeden Fall geben async/await versuchen.
Nur sicher sein, um Gewicht in der Entscheidung, wie Sie heute sind, noch nicht ratifizierten Spezifikation.
Promise.then
. Also, wenn Sieawait
Ergebnis in einer Ereignisprozedur in einem browser, es ist definitiv nicht genial.await
auf top-Niveau, aber das downstream-code ist eine andere operation, die nicht erfordert die zurückgegebenen Daten durch dieasync
Funktion, dann ist es ein design-Fehler.await
könnte nützlich sein, in einem Knoten, der server-Anwendung oder in einer web-worker, aber nicht in front-end-code.async
ist einfach nur Zucker.async/await
mehr, als es mit einem Rückruf. Wie Sie sagte, es ist nur Zucker, sondern hinter der Szene, es funktioniert genauso.await
dies kann eine lange Zeit dauern, mitPromise.then
nicht.await
und dann unterbrechen die Ausführung der asynchronen Funktion und Rückgabe der Kontrolle an den übergeordneten Rahmen und geben ein Versprechen. Wenn der übergebene Wert zu erwarten steht, wird die Ausführung der Funktion wird fortgesetzt. Es gibt einen wichtigen Unterschied zwischen Sperrung und Aussetzung der Ausführung.await
innerhalb von asynchronen Funktionen. Ich hatte die normalen Funktionen im Kopf, die wäre synchron und somit blockieren würde.Während Sie können einen Wert aus einer erwarteten Versprechen innerhalb eines async-Funktion (einfach weil es hält die Funktion zum warten auf ein Ergebnis), Sie können nicht immer bekommen Sie einen Wert direkt aus einem Versprechen und wieder in den gleichen Bereich wie die Verheißung selbst.
Dass da "aus" bedeuten würde versuchen etwas zu nehmen, dass es in der Zukunft (die schließlich gelöst Wert) und legt es in einen Kontext (synchron-variable Zuordnung), die bereits in der Vergangenheit geschehen.
Ist, Zeit-Reisen. Und selbst wenn eine Zeitreise möglich wäre, wäre es wahrscheinlich nicht eine gute Codierung der Praxis, weil die Zeit Reisen kann sehr verwirrend sein.:)
Im Allgemeinen, wenn Sie sich selbst zu finden Gefühl, wie Sie brauchen, um dies zu tun, es ist gutes Zeichen, dass Sie brauchen, um etwas umgestalten. Beachten Sie, dass das, was du tust mit "Ergebnis => Ergebnis.Daten" hier:
..ist bereits ein Fall von Ihnen arbeiten mit (buchstäblich, mapping über) den Wert durch übergabe an eine Funktion. Aber, unter der Annahme, dass "//rest des Skripts" nicht etwas wichtiges in Bezug zu diesem Wert, werden Sie wahrscheinlich wollen, um weiter mapping über die jetzt aktualisierte Wert mit noch eine weitere Funktion, die dann etwas tut Nebeneffekt-y mit dem Wert (wie z.B. das anzeigen der Daten auf dem Bildschirm).
"doSomethingWithData" genannt werden (wenn es immer genannt) zu einem unbekannten Zeitpunkt in der Zukunft. Das ist, warum es eine gute Praxis, um klar zu Kapseln alle, dass das Verhalten in einer spezifischen Funktion und dann Haken, die Funktion bis zu dem Versprechen Kette.
Ist es ehrlich gesagt so besser, da es erfordert, dass Sie klar deklarieren, dass eine bestimmte Folge von Ereignissen, die wird geschehen, explizit getrennt von der ersten Ausführung durch alle Ihre Anwendung code-Ausführung.
Anders ausgedrückt, stellen Sie sich dieses Szenario hypothetisch ausgeführt, in die Globale top-level-Umfang:
Was würde dort geschehen? Es gibt zwei Möglichkeiten und beide sind schlecht.
bevor er verstehen konnte, was "foo" & "bar" wäre... Nein, könnte werden. (dies ist
was "erwarten" in einer async-Funktion, in der Tat zu tun: es hält
die gesamte Ausführung der Funktion, bis der Wert verfügbar ist oder ein Fehler geworfen wird)
passiert), da, wie synchron ausgeführt, Sie hätten nur sein
nicht vorhandene Eigenschaften des top-level-Promise-Objekt (welches nicht selbst ein "Wert"
sondern eine quasi-Monadischen Hülle um immer einen eventuellen Wert ODER ein Fehler), die meisten
wahrscheinlich nicht auch einen Wert enthalten noch.