Versprechen sind nicht nur Rückrufe?
Ich habe die Entwicklung von JavaScript für ein paar Jahre, und ich verstehe nicht die Aufregung über Versprechungen überhaupt.
Scheint es, wie alles, was ich zu tun ist, ändern:
api(function(result){
api2(function(result2){
api3(function(result3){
//do work
});
});
});
Denen könnte ich eine Bibliothek wie async für sowieso, mit so etwas wie:
api().then(function(result){
api2().then(function(result2){
api3().then(function(result3){
//do work
});
});
});
Ist mehr code und weniger lesbar. Ich habe nicht alles gewinnen, dann ist es nicht plötzlich auf Magische Weise "flach". Nicht zu erwähnen, die zu konvertieren, Dinge zu Versprechen.
Also, was ist die große Aufregung verspricht hier?
InformationsquelleAutor der Frage Benjamin Gruenbaum | 2014-03-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verspricht sind keine Rückrufe. Ein Versprechen darstellt, das Zukunft, die das Ergebnis einer asynchronen operation. Natürlich schreiben wie Sie es tun, bekommen Sie wenig nutzen. Aber wenn Sie schreiben Sie so, wie Sie gemeint sind verwendet werden, können Sie schreiben von asynchronem code in einer Weise, die ähnelt synchronen code und ist viel einfacher zu Folgen:
Sicherlich nicht viel weniger code, aber sehr viel besser lesbar.
Aber dies ist nicht das Ende. Lassen Sie uns entdecken Sie den wahren nutzen: Was wenn Sie wollten prüfen, ein Fehler in einem der Schritte? Es würde die Hölle sein, es zu tun mit callbacks, aber mit dem Versprechen, ist ein Stück Kuchen:
So ziemlich das gleiche wie ein
try { ... } catch
block.Sogar noch besser:
Und noch besser: Was ist, wenn diese 3 Anrufe zu
api
api2
api3
könnte gleichzeitig ausführen (z.B. wenn Sie AJAX-Aufrufe), aber Sie musste noch warten, bis die drei? Ohne Versprechungen, die Sie haben sollten, erstellen Sie eine Art von counter. Mit dem Versprechen, mit dem ES6-notation, ist ein weiteres Stück Kuchen und Recht ordentlich:Hoffe, Sie sehen, Verspricht ein neues Licht auf jetzt.
InformationsquelleAutor der Antwort Oscar Paz
Ja, Versprechen sind asynchrone Rückrufe. Sie können nicht alles tun, dass Rückrufe nicht tun können, und Sie stehen vor den gleichen Problemen mit ungleichzeitigkeiten als mit plain-callbacks.
Jedoch, die Versprechen mehr als nur Rückrufe. Sie sind eine sehr mächtige Abstraktion, dass sauberer und besser, funktionalen code mit weniger fehleranfällig boilerplate.
Versprechungen sind Objekte, die das Ergebnis einer einzigen (asynchronen) Berechnung. Sie auflösen zu diesem Ergebnis nur einmal. Es gibt ein paar Dinge, was das bedeutet:
Verspricht die Implementierung einer observer-Muster:
return
ein Promise-ObjektVersprechungen sind verkettbare (monadischenwenn Sie wollen):
.then()
Methode. Es wird ein callback aufgerufen werden, mit dem ersten Ergebnis, und gibt ein Versprechen für das Ergebnis der Versprechen, dass der Rückruf zurückgegeben.Klingt kompliziert? Zeit für ein code-Beispiel.
Abflachung kommt nicht magisch, aber Sie können leicht tun es. Für Ihre stark verschachtelten Beispiel, die (fast) gleichwertig wäre
Wenn Sie sehen den code dieser Methoden hilft, Verständnis, hier ist eine grundlegende Versprechen lib in ein paar Zeilen.
Dem Versprechen Abstraktion ermöglicht eine wesentlich bessere Kombinierbarkeit von Funktionen. Zum Beispiel, neben
then
für die Verkettung, dieall
Funktion erstellt ein Versprechen für das Ergebnis aus der Kombination von mehreren parallel Wartezeit verspricht.Nicht zuletzt Verspricht mit integrierten Fehlerbehandlung. Das Ergebnis der Berechnung sein könnte, dass entweder das Versprechen ist erfüllt mit einem Wert, oder es ist abgelehnt mit ein Grund. Alle Kompositions-Funktionen behandeln dies automatisch und verbreiten von Fehlern im Versprechen-Ketten, so dass Sie nicht brauchen, zu kümmern, es explizit überall, im Gegensatz zu einem plain-callback-Implementierung. Am Ende, können Sie eine dedizierte Fehler-callback für alle vorkommenden Ausnahmen.
Ist das ganz trivial, eigentlich mit guten Versprechen Bibliotheken, siehe Wie konvertiere ich eine vorhandene callback-API verspricht?
InformationsquelleAutor der Antwort Bergi
Zusätzlich zu den bereits etablierten Antworten, mit ES6 Pfeil-Funktionen Verspricht sich von einer bescheiden glänzenden kleinen blauen Zwerg gerade zu einem roten Riesen. Das ist unterzugehen in einer supernova:
Als oligofren hingewiesen, ohne Argumente zwischen api-Aufrufe, die Sie nicht brauchen, die anonyme wrapper-Funktionen:
Und schließlich, wenn Sie erreichen wollen, ein supermassives Schwarzes Loch Ebene, Versprechen kann erwartet werden:
InformationsquelleAutor der Antwort John Weisz
Zusätzlich zu den anderen Antworten, die ES2015 syntax fügt sich nahtlos mit dem Versprechen, die Verringerung noch mehr boilerplate-code:
InformationsquelleAutor der Antwort Duncan Luk
Zusätzlich zu dem großartigen Antworten oben, 2 weitere Punkte können Hinzugefügt werden:
1. Semantischer Unterschied:
Verspricht vielleicht auch schon gelöst bei der Erstellung. Dies bedeutet Sie Garantie-Bedingungen eher als Ereignisse. Wenn Sie sind bereits behoben, die gelöst-Funktion übergeben werden, nennt man auch heute noch.
Umgekehrt Rückrufe verarbeiten der Ereignisse. Also, wenn das Ereignis, das Sie interessiert sind passiert, bevor der callback registriert worden ist, wird der callback nicht aufgerufen.
2. Inversion of control
Rückrufe beinhalten inversion of control. Wenn Sie sich registrieren einer callback-Funktion, die bei jedem API die Javascript-Laufzeit speichert die callback-Funktion und ruft es von der Ereignis-Schleife, sobald es ist bereit zu laufen.
Finden Die Javascript-Event-Schleife für eine Erklärung.
Mit VersprichtKontrolle befindet, mit dem aufrufenden Programm. Die .dann () - Methode kann aufgerufen werden, jederzeit wenn wir speichern das promise-Objekt.
InformationsquelleAutor der Antwort dww
Versprechen nicht Rückrufe sind beide Programmier-Idiome, die Erleichterung der asynchronen Programmierung. Mit einem async - /await-Stil der Programmierung mit Coroutinen oder Generatoren, die Rendite verspricht, könnte erwogen werden, eine 3. solche idiom. Ein Vergleich dieser Ausdrücke in verschiedenen Programmier-Sprachen (wie Javascript) ist hier: https://github.com/KjellSchubert/promise-future-task
InformationsquelleAutor der Antwort Kjell Schubert
Keine Versprechungen sind nur wrapper, die auf Rückrufe
Beispiel
Sie können javascript verwenden, native verspricht mit node js
InformationsquelleAutor der Antwort Apoorv