Einführung
JavaScript Promises können schwierig zu verstehen sein. Daher möchte ich die Art und Weise, wie ich Promises verstehe, niederschreiben.
Promises verstehen
Ein Promise kurz gesagt:
“Stell dir vor, du bist ein Kind. Deine Mutter verspricht dir, dass sie dir nächste Woche ein neues Handy kauft.”
Du weißt nicht ob du das Handy bekommst, bis nächste Woche. Deine Mutter kann dir wirklich ein brandneues Handy kaufen, oder sie tut es nicht.
Das ist ein Versprechen. Ein Versprechen hat drei Zustände. Sie sind:
- Pending: Du weißt nicht ob du das Handy bekommst
- Fulfilled: Mutter ist zufrieden, sie kauft dir ein brandneues Handy
- Rejected: Mutter ist unzufrieden, sie kauft dir kein Handy
Ein Promise erstellen
Lassen Sie uns dies in JavaScript umwandeln.
Der Code ist selbst recht ausdrucksstark.
Unten sehen Sie, wie die Promise-Syntax normalerweise aussieht:
Promise konsumieren
Nachdem wir die Promise haben, lassen Sie uns sie konsumieren:
Lassen Sie uns das Beispiel ausführen und das Ergebnis sehen!
Demo: https://jsbin.com/nifocu/1/edit?js,console
Ketten von Promises
Promises sind verkettbar.
Stell dir vor, du, das Kind, versprichst deinem Freund, dass du ihm das neue Telefon zeigst, wenn deine Mutter dir eines kauft.
Das ist ein weiteres Versprechen. Lass es uns aufschreiben!
Hinweis: Wir können den obigen Code verkürzen, indem wir ihn wie folgt schreiben:
Lass uns die Promises verketten. Du, das Kind, kannst das showOff
Versprechen nur starten, nachdem das willIGetNewPhone
Versprechen erfüllt wurde.
So kannst du das Versprechen verketten.
Versprechen sind asynchron
Versprechen sind asynchron. Lassen Sie uns eine Nachricht vor und nach dem Aufruf des Versprechens protokollieren.
Welche Ausgabereihenfolge erwarten Sie? Sie könnten erwarten:
1. before asking Mom
2. Hey friend, I have a new black Samsung phone.
3. after asking mom
Tatsächlich ist die Ausgabereihenfolge jedoch:
1. before asking Mom
2. after asking mom
3. Hey friend, I have a new black Samsung phone.
Sie würden nicht aufhören zu spielen, während Sie auf das Versprechen Ihrer Mutter (das neue Telefon) warten. Das nennen wir asynchron: Der Code wird ausgeführt, ohne zu blockieren oder auf das Ergebnis zu warten. Alles, was auf das Ergebnis eines Versprechens warten muss, wird in .then
eingefügt.
Hier ist das vollständige Beispiel in ES5:
Promises in ES5, ES6/2015, ES7/Next
ES5 – Die meisten Browser
Der Democode ist in ES5-Umgebungen (alle wichtigen Browser + NodeJs) funktionstüchtig, wenn Sie die Bluebird-Promise-Bibliothek einbinden. Das liegt daran, dass ES5 Promises nicht out-of-the-box unterstützt. Eine weitere bekannte Promise-Bibliothek ist Q von Kris Kowal.
ES6 / ES2015 – Moderne Browser, NodeJs v6
Die Democode funktioniert direkt, weil ES6 Promises nativ unterstützt. Darüber hinaus können wir mit ES6-Funktionen den Code weiter vereinfachen, indem wir eine Pfeilfunktion verwenden und const
und let
nutzen.
Hier ist das vollständige Beispiel in ES6-Code:
Beachte, dass alle var
durch const
ersetzt wurden. Alle function(resolve, reject)
wurden vereinfacht zu (resolve, reject) =>
. Diese Änderungen bringen einige Vorteile mit sich.
ES7 – Async/Await
ES7 führte die Syntax async
und await
ein. Sie macht die asynchrone Syntax leichter verständlich, ohne .then
und .catch
.
Schreiben wir unser Beispiel mit ES7-Syntax um:
Versprechen und wann man sie nutzen sollte
Warum benötigen wir Versprechen? Wie sah die Welt vor den Versprechen aus? Bevor wir diese Fragen beantworten, gehen wir zurück zu den Grundlagen.
Normale Funktion VS Asynchrone Funktion
Schauen wir uns diese beiden Beispiele an. Beide Beispiele führen die Addition von zwei Zahlen durch: eine fügt mit normalen Funktionen hinzu und die andere fügt remote hinzu.
Normale Funktion zur Addition von zwei Zahlen
Asynchrone Funktion zur Addition von zwei Zahlen
Wenn du die Zahlen mit der normalen Funktion addierst, erhältst du das Ergebnis sofort. Wenn du jedoch einen Remote-Aufruf ausführst, um das Ergebnis zu erhalten, musst du warten und kannst das Ergebnis nicht sofort erhalten.
Sie wissen nicht, ob Sie das Ergebnis erhalten, da der Server möglicherweise ausgefallen ist, eine langsame Reaktionszeit hat usw. Sie möchten nicht, dass Ihr gesamter Prozess blockiert wird, während Sie auf das Ergebnis warten.
Das Aufrufen von APIs, das Herunterladen von Dateien und das Lesen von Dateien gehören zu den üblichen asynchronen Operationen, die Sie durchführen werden.
Sie müssen keine Promises für einen asynchronen Aufruf verwenden. Vor Promises haben wir Callbacks verwendet. Callbacks sind eine Funktion, die Sie aufrufen, wenn Sie das Rückgabeergebnis erhalten. Lassen Sie uns das vorherige Beispiel so ändern, dass es einen Callback akzeptiert.
Nachfolgende asynchrone Aktion
Anstatt die Zahlen nacheinander zu addieren, möchten wir dreimal addieren. In einer normalen Funktion würden wir dies tun:
So sieht das mit Callbacks aus:
Demo: https://jsbin.com/barimo/edit?html,js,console
Diese Syntax ist aufgrund der tief verschachtelten Callbacks weniger benutzerfreundlich.
Tief verschachtelte Callbacks vermeiden
Promises können dir dabei helfen, tief verschachtelte Callbacks zu vermeiden. Schauen wir uns die Promise-Version desselben Beispiels an:
Mit Promises glätten wir den Callback mit .then
. Es sieht auf eine Weise sauberer aus, weil keine Callback-Verschachtelung vorhanden ist. Mit der ES7 async
-Syntax könnten Sie dieses Beispiel weiter verbessern.
Observables
Bevor Sie sich für Promises entscheiden, gibt es etwas, das aufgetaucht ist, um Sie bei der Handhabung von asynchronen Daten zu unterstützen, nämlich Observables
.
Schauen wir uns das gleiche Beispiel an, das mit Observables geschrieben wurde. In diesem Beispiel verwenden wir RxJS für die Observables.
Observables können noch interessantere Dinge tun. Zum Beispiel kann die delay
-Funktion um 3 Sekunden
verzögern, und das mit nur einer Codezeile, oder wiederholen, so dass Sie einen Aufruf eine bestimmte Anzahl von Malen wiederholen können.
Sie können eins meiner RxJs-Beiträge hier lesen.
Schlussfolgerung
Das Kennenlernen von Callbacks und Promises ist wichtig. Verstehen und verwenden Sie sie. Machen Sie sich noch keine Sorgen über Observables. Je nach Situation können alle drei in Ihrer Entwicklung eine Rolle spielen.
Source:
https://www.digitalocean.com/community/tutorials/understanding-javascript-promises