Versprechen gegen beobachtbar
Kann mir bitte jemand erklären den Unterschied zwischen Promise
und Observable
im Eckigen?
Ein Beispiel zu jedem wäre hilfreich beim Verständnis der Fälle.
In welchem Szenario können wir nutzen?
InformationsquelleAutor der Frage Rohit | 2016-05-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versprechen
Einen
Promise
verarbeitet einzelnes Ereigniswenn eine asynchrone operation abgeschlossen wird oder fehlschlägt.Hinweis: Es gibt
Promise
Bibliotheken gibt, die Unterstützung Stornierung, aber ES6Promise
nicht so weit.Beobachtbaren
Einer
Observable
ist wie einStream
(in vielen Sprachen) und ermöglicht die übergabe von null oder mehr Ereignisse, bei denen der callback wird aufgerufen, für jedes Ereignis.Oft
Observable
ist bevorzugt überPromise
weil es bietet Ihnen die Funktionen vonPromise
und mehr. MitObservable
ist es egal, ob Sie möchten, um zu behandeln, 0, 1, oder mehrere Ereignisse. Sie können verwenden die gleiche API in jedem Fall.Observable
hat auch den Vorteil, überPromise
werden stornierbar. Wenn das Ergebnis einer HTTP-Anfrage an einen server oder eine andere teure async operation ist nicht mehr nötig, dieSubscription
einerObservable
ermöglicht, das Abonnement zu kündigen, während einePromise
wird schließlich rufen Sie den Erfolg "oder" fehlgeschlagen Rückruf, auch wenn Sie nicht brauchen, die Mitteilung oder das Ergebnis, es bietet mehr.Beobachtbaren bietet Betreiber wie
map
forEach
reduce
... ähnlich wie ein arrayGibt es auch mächtige Operatoren wie
retry()
oderreplay()
... das sind oft ganz praktisch.InformationsquelleAutor der Antwort Günter Zöchbauer
Verspricht:
Observablen:
InformationsquelleAutor der Antwort Relu Mesaros
Beide
Promises
undObservables
uns mit Abstraktionen, die uns helfen, befassen sich mit der asynchrone Natur unserer Anwendungen. Der Unterschied zwischen Ihnen war, deutete eindeutig durch @Günter und @aufgrund der Kr.Da ein code-snippet, das ist mehr Wert als tausend Worte, lassen Sie uns gehen Sie durch das folgende Beispiel zu verstehen, Sie leichter.
Winkel verwendet Rx.js Observablen anstelle der Versprechen, die für den Umgang mit HTTP.
Angenommen, Sie bauen eine Suchfunktion , sollte sofort zeigen Sie die Ergebnisse während der Eingabe. Klang vertraut, aber es gibt eine Menge von Herausforderungen, die sich mit dieser Aufgabe.
HTTP
Anfragen. Im Grunde wollen wir nur schlagen, sobald der Benutzer aufgehört hat, die Eingabe statt mit jedem Tastenanschlag.Die demo wird einfach aus zwei Dateien:
app.ts
undwikipedia-service.ts
. In einem realen Szenario würden wir wahrscheinlich aufteilen, Dinge weiter oben, obwohl.Unten ist Versprechen-basierend Umsetzung, nicht der Griff einer der beschriebenen Sonderfälle.
wikipedia-service.ts
Sind wir die Injektion der
Jsonp
service, um einenGET
Antrag gegen die Wikipedia-API mit einem bestimmten Suchbegriff. Beachten Sie, dass wir nennentoPromise
um von einemObservable<Response>
zu einemPromise<Response>
. Schließlich am Ende mit einemPromise<Array<string>>
als Rückgabe-Typ der unsere such-Methode.app.ts
Nicht viel von einer überraschung, die hier entweder. Wir Spritzen unsere
WikipediaService
aussetzen und seine Funktionalität über eine such-Methode, um die Vorlage. Die Vorlage einfach an sich bindet keyup und fordertsearch(term.value)
.Wir packen das Ergebnis der Versprechendass die Suche-Methode der WikipediaService zurück und setzen Sie es als ein einfaches Array von strings die zu der Vorlage, so dass wir
*ngFor
Schleife durch und bauen Sie eine Liste für uns.Siehe das Beispiel von Versprechen-basierend Umsetzung auf Plunker
Wo Observablen wirklich glänzen
Ändern wir unseren code nicht hammer der Endpunkt mit jedem Tastendruck, sondern nur eine Anfrage senden, wenn der Benutzer beendet die Eingabe für 400 ms
Enthüllen solchen super-Kräfte, die wir zunächst brauchen, um eine
Observable<string>
führt, dass die Suche Begriff, den der Benutzer eingibt. Statt manuell die Bindung an das keyup-Ereignis, wir können den Vorteil von Angular istformControl
Richtlinie. Diese Direktive zu verwenden, müssen wir zunächst importieren Sie dieReactiveFormsModule
in unserer application-Modul.app.ts
Einmal importiert, können wir formControl innerhalb unserer Vorlage und legen Sie es auf den Namen "Begriff".
In unserer Komponente, erstellen wir eine Instanz von
FormControl
aus@angular/form
und setzen Sie es als ein Feld unter dem Namen Begriff auf unsere Komponente.Hinter den kulissen, Begriff automatisch stellt eine
Observable<string>
als EigentumvalueChanges
dass wir abonnieren können. Jetzt haben wir eineObservable<string>
überwindung der Benutzer die Eingabe so einfach wie das aufrufendebounceTime(400)
auf unsererObservable
. Dann kommt wieder eine neueObservable<string>
wird nur emittieren einen neuen Wert, wenn es nicht kommen neue Werte für 400ms.Wäre es eine Verschwendung von Ressourcen zu senden, eine weitere Anforderung für einen Suchbegriff, die unsere app schon zeigt die Ergebnisse für. Alle haben wir zu tun, um das gewünschte Verhalten zu nennen, die
distinctUntilChanged
Betreiber Recht, nachdem wir aufgerufendebounceTime(400)
Siehe das Beispiel von Beobachtbaren Umsetzung auf Plunker
Soweit ich es über Http im Winkel, ich bin damit einverstanden, dass in der normalen Fällen gibt es nicht viel Unterschied bei der Verwendung von Beobachtbaren über Versprechen. Keine der Vorteile wirklich relevant sind hier in der Praxis. Ich hoffe, ich kann sehen, einige erweiterte use-case in der Zukunft 🙂
InformationsquelleAutor der Antwort trungk18
Beide Verspricht und Observablen wird uns helfen, die Arbeit mit dem asynchrone Funktionalitäten in JavaScript. Sie sind sich sehr ähnlich, in vielen Fällen, es gibt jedoch immer noch einige Unterschiede zwischen den beiden, wie gut, verspricht sind Werte, die aufgelöst wird, in
asynchronous
Möglichkeiten, wie http Anrufe. Auf der anderen Seite observablen deal mit der Reihenfolge der asynchrone Ereignisse. Die wichtigsten Unterschiede sind, wie unten aufgeführt:Versprechen:
beobachten:
Habe ich dann auch erstellt das grafische Bild für Sie unten zeigen die Unterschiede visuell:
InformationsquelleAutor der Antwort Alireza
Verspricht
Observablen
Einem Betreiber wiederholen kann verwendet werden, zu wiederholen, Wann immer nötig, auch wenn wir brauchen, um erneut zu beobachten, basierend auf bestimmten Bedingungen retryWhen verwendet werden kann.
Hinweis: Eine Liste mit Operatoren zusammen mit Ihrer interaktiven Diagrammen verfügbar ist hier bei RxMarbles.com
InformationsquelleAutor der Antwort Aravind
Es ist ein Nachteil der Observablen fehlt in den Antworten. Versprechungen, die den ES7 async/await-Funktionen. Mit Ihnen, können Sie schreiben von asynchronem code wie es wäre, einen synchronen Funktionsaufruf, so dass Sie nicht brauchen Rückrufe mehr. Die einzige Möglichkeit für die Observablen, dies zu tun, ist zu konvertieren Verspricht. Aber wenn Sie konvertieren Sie Verspricht, Sie kann nur einen Rückgabewert wieder:
Weiter Lesen: Wie kann ich `warten` auf ein Rx Beobachtbar?
InformationsquelleAutor der Antwort besserwisser
Ich bin ein Bilder Kerl, dieser fehlte in den anderen Antworten:
InformationsquelleAutor der Antwort ishandutta2007
verspricht und Beobachten sowohl die Handhabung der asynchrone Aufruf nur.oben finden
Bild für das Haupt-Unterschied.
InformationsquelleAutor der Antwort sudheer nunna
Obwohl diese Antwort ist spät, habe ich eine Zusammenfassung der Unterschiede unten,
Beobachten:
function
, nimmtan observer
und gibt einenfunction Observer: an object with next, error.
subscribe/unsubscribe
zu seinen Daten-stream, emittierennächste Wert der Beobachter,
notify
der Beobachter übererrors
undinformieren den Betrachter über die
stream completion
function to handle next value
,Irrtümer unddas Ende des Stroms(ui-events,http-Antworten,Daten mit web sockets).
multiple values
im Laufe der Zeitcancel-able/retry-able
und unterstützt Operatoren wiemap,filter,reduce
etc.-
Observable.create()
- Renditen Beobachtbar ist, können Methoden aufgerufen werden, die auf-
Observer Observable.from()
- konvertiert ein array oder iterierbar in-
Observable Observable.fromEvent()
- konvertiert ein Ereignis zu Beobachten-
Observable.fromPromise()
- konvertiert ein Versprechen in die Beobachtbare-
Observable.range()
- gibt eine Sequenz von ganzen zahlen in dem angegebenen BereichVersprechen:
Ein Versprechen stellt eine Aufgabe, die wird fertig in die Zukunft;
Verspricht sich
resolved by a value
;Verspricht abgelehnt bekommen von Ausnahmen;
Nicht
cancellable
und es gibta single value
Ein Versprechen über eine Funktion
(then)
-gibt dann eine neue
promise
;-ermöglicht die
attachment
der, der ausgeführt wird, basierend aufstate
;-
handlers
sindguaranteed
um auszuführen,order attached
;InformationsquelleAutor der Antwort Sajeetharan
Ich glaube, alle anderen Antworten sollten klar Ihre Zweifel.
Trotzdem, ich wollte nur hinzufügen, dass observablen basieren auf der funktionalen Programmierung, und ich finde es sehr nützlich, die Funktionen, die mit ihm gekommen wie map, flatmap, reduce, zip. Die Konsistenz der web-erreicht, vor allem, wenn es hängt von API-Anfragen ist eine brutale Verbesserung.
Empfehle ich diese Dokumentationda es die offizielle Dokumentation von reactiveX und ich finde, es ist das beste da draußen.
Wenn du willst in die observablen ich würde vorschlagen, diese 3-tlg. post:
http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/
Obwohl es bedeutete für RxJava, die Konzepte sind die gleichen, und es ist wirklich gut erklärt. In reactiveX Unterlagen haben Sie die äquivalenzen für jede Funktion. Muss man sich für RxJS.
Ich Hoffe das hilft, habe gerade versucht hier beitragen. 🙂
InformationsquelleAutor der Antwort Marc Pérez
Ich habe gerade behandelt ein Thema, wo die Versprechungen waren die beste Lösung, und ich Teile es hier für alle stolpern über diese Frage in der Veranstaltung ist es nützlich, (das war genau die Antwort die ich suchte früher):
In einem Angular2 Projekt habe ich einen service an, einige Parameter und gibt einen Wert zurück Liste zu füllen drop-down-Menüs in einem Formular. Wenn die form-Komponente initialisiert wurde, muss ich anrufen die den gleichen Dienst mehrere Male mit verschiedenen Parametern zu definieren, die eine Reihe von verschiedenen dropdown-Menüs, aber wenn ich einfach Warteschlange, bis alle Variablen, die zum Aufruf des Dienstes, nur die Letzte erfolgreich abgeschlossen, und die restlichen Fehler aus. Der service abrufen aus der Datenbank könnte nur mit einem Antrag zu einem Zeitpunkt.
Der einzige Weg, um erfolgreich zu bevölkern, die alle dropdown-Menü Variablen war ein Telefonat mit dem service in einer Weise, die verhindert, dass eine neue Anfrage bearbeitet wird, bis die Letzte Anforderung beendet wurde, und die Versprechen /.dann Mechanismus, der das problem schön.
Definierte ich die Funktionen in die Komponente, und dann rief initializeDropDowns() in ngOnInit.
Den fetchValueList Funktion gibt ein Versprechen, so der erste Aufruf übergibt die ersten listCode und wenn das Versprechen aufgelöst wird, ist der Rückgabewert wird in die variable Daten .dann blockieren Sie, wo wir können ordnen Sie die diese.firstValList variable. Die Funktion hat Daten zurückgegeben, wir wissen, dass der service abgeschlossen ist und es sicher wieder anrufen, mit der zweiten listCode, ist der Rückgabewert in der variable Daten in die nächste .dann blockieren Sie und wir weisen Sie der.secondValList variable.
Können wir diese Kette so oft wie erforderlich, um füllen Sie alle Variablen, und die Letzte code-block, die wir einfach weglassen, die return-Anweisung und der block wird beendet.
Dies ist ein sehr spezieller Anwendungsfall, in dem wir einen einzigen Dienst muss mehrmals aufgerufen werden, wenn die Komponente initialisiert, und wo der service zu vervollständigen Holen und einen Wert zurückgeben, bevor Sie erneut aufgerufen werden kann, aber in diesem Fall, das Versprechen /.dann war die Methode ideal.
InformationsquelleAutor der Antwort Stephen R. Smith
Observablen vs Verspricht
Verspricht und Observablen ,beide bieten uns eine einfache Möglichkeit, die uns helfen, Kämpfen mit dem Versuch, asynchrone Natur von unseren Anwendungen. Es gibt jedoch wichtige Unterschiede zwischen den beiden:
Verspricht eigentlich die Durchsetzung dieser Semantik. Sie können erstellen Sie ein Versprechen, das löst sich mit der etwas Wert:
Aber Versuch zu lösen Versprechen, wieder mit einem anderen Wert, wird scheitern. Versprechen ist immer gelöst mit dem ersten Wert übergeben Sie den resolve-Funktion und ignoriert weitere Aufrufe von Ihr:
Im Gegenteil, Observablen erlauben, Sie zu lösen (oder, wie wir sagen, "emittieren") mehrere Werte. Hier ist, wie es Aussehen würde:
Beachten Sie, wie ähnlich sich die syntax ist — wechselten wir Versprechen, Sie zu Beobachten, ersetzt beheben-Funktion mit Beobachter.Nächster Anruf und anstatt dann verwendet, abonnieren Sie verhält sich sehr ähnlich.
InformationsquelleAutor der Antwort user1012506
Versprechen:
Beobachtbar ist:
Die Sie verwenden können, verspricht stattdessen der observablen beim Aufruf von HTTP in Eckigen wenn Sie es wünschen.
InformationsquelleAutor der Antwort Iosua Sipos
Versprechen - Geben Sie einen einzelnen Wert in der Zukunft. Nicht faul . Nicht Abbrechen können. Es wird entweder ablehnen oder auflösen.
Beobachten - Bieten mehrere Wert in der Zukunft. Faul . Abbrechen können . Es werden weitere Methoden live-map,filter,reduce.
InformationsquelleAutor der Antwort Gajender Singh
Gibt es viele Antworten zu diesem Thema bereits, so würde ich nicht hinzufügen, eine redundant.
Aber für jemanden, der gerade angefangen zu lernen, Beobachtbaren /Winkel und Wunder, die man zu nutzen vergleichen mit Versprechenich würde empfehlen, Sie halten alles, was Beobachtbar und konvertieren Sie alle vorhandenen Verspricht in Ihrem Projekt zu Beobachten.
Einfach, weil Eckige Rahmen sich selbst und die Gemeinschaft aller mit zu Beobachten. Es wäre also vorteilhaft, wenn die Integration framework-Dienste oder 3rd-party-Module und Verkettung alles zusammen.
InformationsquelleAutor der Antwort Xinan
Erklären in Bezug Eckige Http-Aufrufe für remote-Api:
Verspricht ist verwenden, um den Zustand zu verwalten asynchroner Aufrufe. man die Daten von remote-Api und zeigen Sie in der Ansicht
und in Beobachtbaren kommen aus beobachtbaren Muster und die Einführung von Rxjs, wenn es Ihnen facility zum aktualisieren von Daten, die mehrere Male im stream als beobachtbare Daten.
InformationsquelleAutor der Antwort AKD