Kann jemand bitte den Unterschied zwischen Promise
und Observable
in Angular erklären?
Ein Beispiel für beide wäre hilfreich, um beide Fälle zu verstehen. In welchem Szenario können wir jeden Fall verwenden?
Versprechen
Ein Promise
behandelt ein einzelnes Ereignis , wenn ein asynchroner Vorgang abgeschlossen wird oder fehlschlägt.
Hinweis: Es gibt Promise
-Bibliotheken, die die Stornierung unterstützen, aber ES6 Promise
ist dies bislang nicht.
Beobachtbar
Ein Observable
ähnelt einemStream
(in vielen Sprachen) und ermöglicht die Übergabe von null oder mehr Ereignissen, bei denen der Rückruf für jedes Ereignis aufgerufen wird.
Oft wird Observable
gegenüber Promise
bevorzugt, da es die Funktionen von Promise
und mehr bietet. Bei Observable
spielt es keine Rolle, ob Sie 0, 1 oder mehrere Ereignisse behandeln möchten. Sie können jeweils die gleiche API verwenden.
Observable
hat auch gegenüber Promise
den Vorteil, stornierbar zu sein. Wenn das Ergebnis einer HTTP-Anforderung an einen Server oder eines anderen kostspieligen asynchronen Vorgangs nicht mehr benötigt wird, können Sie mit der Subscription
einer Observable
das Abonnement abbrechen, während eine Promise
schließlich den Erfolg oder den fehlgeschlagenen Rückruf abruft brauchen die Benachrichtigung oder das Ergebnis, das sie liefert.
Observable bietet Operatoren wie map
, forEach
, reduce
, ... ähnlich einem Array
Es gibt auch mächtige Operatoren wie retry()
oder replay()
, ..., die oft recht praktisch sind.
Sowohl Promises
als auch Observables
liefern uns Abstraktionen, die uns beim Umgang mit der asynchronen-Natur unserer Anwendungen helfen. Der Unterschied zwischen ihnen wurde von @ Günter und @Relu deutlich gemacht.
Da ein Code-Snippet mehr als tausend Worte wert ist, lassen Sie uns das folgende Beispiel durchgehen, um sie besser zu verstehen.
Danke @Christoph Burgdorf für den tollen Artikel
Angular verwendet Rx.js Observables anstelle von Versprechungen für den Umgang mit HTTP.
Angenommen, Sie erstellen ein Suchfunktion, das Ihnen bei der Eingabe sofort die Ergebnisse anzeigen soll. Klingt vertraut, aber es gibt viele Herausforderungen, die sich aus dieser Aufgabe ergeben.
HTTP
-Anforderungen überfluten. Grundsätzlich möchten wir es nur dann treffen, wenn der Benutzer nicht mehr mit jedem Tastendruck eingibt.Die Demo besteht einfach aus zwei Dateien: app.ts
und wikipedia-service.ts
. In einem realen Szenario würden wir die Dinge jedoch höchstwahrscheinlich weiter aufteilen.
Nachfolgend finden Sie eine Promise-basierte Implementierung, die keine der beschriebenen Edge-Fälle behandelt.
wikipedia-service.ts
import { Injectable } from '@angular/core';
import { URLSearchParams, Jsonp } from '@angular/http';
@Injectable()
export class WikipediaService {
constructor(private jsonp: Jsonp) {}
search (term: string) {
var search = new URLSearchParams()
search.set('action', 'opensearch');
search.set('search', term);
search.set('format', 'json');
return this.jsonp
.get('http://en.wikipedia.org/w/api.php?callback=JSONP_CALLBACK', { search })
.toPromise()
.then((response) => response.json()[1]);
}
}
Wir injizieren den Jsonp
-Dienst, um eine GET
-Anforderung gegen die Wikipedia-API mit einem bestimmten Suchbegriff abzugeben. Beachten Sie, dass wir toPromise
aufrufen, um von einem Observable<Response>
zu einem Promise<Response>
zu gelangen. Am Ende steht schließlich ein Promise<Array<string>>
als Rückgabetyp unserer Suchmethode.
app.ts
// check the plnkr for the full list of imports
import {...} from '...';
@Component({
selector: 'my-app',
template: `
<div>
<h2>Wikipedia Search</h2>
<input #term type="text" (keyup)="search(term.value)">
<ul>
<li *ngFor="let item of items">{{item}}</li>
</ul>
</div>
`
})
export class AppComponent {
items: Array<string>;
constructor(private wikipediaService: WikipediaService) {}
search(term) {
this.wikipediaService.search(term)
.then(items => this.items = items);
}
}
Auch hier keine große Überraschung. Wir injizieren unsere WikipediaService
und stellen ihre Funktionalität über eine Suchmethode in der Vorlage zur Verfügung. Die Vorlage bindet sich einfach an keyup und ruft search(term.value)
auf.
Wir entpacken das Ergebnis von Promise, das die Suchmethode von WikipediaService zurückgibt, und legen es als einfaches Array von Strings für die Vorlage zur Verfügung, sodass wir *ngFor
durchlaufen und eine Liste für uns erstellen können.
Siehe das Beispiel der Implementierung von Promise-basiert auf Plunker
Wo Observables wirklich glänzen
Ändern Sie den Code so, dass der Endpunkt nicht bei jedem Tastendruck gehämmert wird, sondern nur eine Anforderung gesendet wird, wenn der Benutzer die Eingabe für 400 ms
Um solche Superkräfte zu enthüllen, benötigen wir zunächst einen Observable<string>
, der den vom Benutzer eingegebenen Suchbegriff enthält. Anstatt manuell an das keyup-Ereignis zu binden, können wir die formControl
-Direktive von Angular nutzen. Um diese Direktive verwenden zu können, müssen Sie zuerst die Variable ReactiveFormsModule
in unser Anwendungsmodul importieren.
app.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { JsonpModule } from '@angular/http';
import { ReactiveFormsModule } from '@angular/forms';
@NgModule({
imports: [BrowserModule, JsonpModule, ReactiveFormsModule]
declarations: [AppComponent],
bootstrap: [AppComponent]
})
export class AppModule {}
Nach dem Import können wir formControl in unserer Vorlage verwenden und auf den Namen "Begriff" setzen.
<input type="text" [formControl]="term"/>
In unserer Komponente erstellen wir eine Instanz von FormControl
aus @angular/form
und machen sie als Feld unter dem Namen term in unserer Komponente verfügbar.
Hinter den Kulissen macht Begriff automatisch einen Observable<string>
als Eigenschaft valueChanges
verfügbar, den wir abonnieren können. Nun, da wir einen Observable<string>
haben, ist das Überwinden der Benutzereingabe so einfach wie das Aufrufen von debounceTime(400)
auf unserer Observable
. Dies gibt einen neuen Observable<string>
zurück, der nur dann einen neuen Wert ausgibt, wenn für 400ms keine neuen Werte gekommen sind.
export class App {
items: Array<string>;
term = new FormControl();
constructor(private wikipediaService: WikipediaService) {
this.term.valueChanges
.debounceTime(400) // wait for 400ms pause in events
.distinctUntilChanged() // ignore if next search term is same as previous
.subscribe(term => this.wikipediaService.search(term).then(items => this.items = items));
}
}
Es wäre eine Verschwendung von Ressourcen, eine weitere Anfrage nach einem Suchbegriff zu versenden, für den unsere App bereits die Ergebnisse anzeigt. Um das gewünschte Verhalten zu erreichen, müssen wir nur den Operator distinctUntilChanged
aufrufen, nachdem wir debounceTime(400)
aufgerufen haben.
Siehe das Beispiel der Implementierung von Observable auf Plunker
Für den Umgang mit Antworten außerhalb der Reihenfolge lesen Sie bitte den gesamten Artikel http://blog.thoughtram.io/angular/2016/01/06/taking-advantage-of-observables-in-angular2.html
Soweit ich Http in Angular verwende, stimme ich zu, dass in normalen Anwendungsfällen keine großen Unterschiede bei der Verwendung von Observable over Promise bestehen. Keiner der Vorteile ist hier in der Praxis wirklich relevant. Ich hoffe, dass ich in Zukunft einen fortgeschrittenen Anwendungsfall sehen kann :)
Mehr erfahren
Sowohl Promises als auch Observables helfen uns bei der Arbeit mit den asynchronen Funktionen in JavaScript. Sie sind in vielen Fällen sehr ähnlich, es gibt jedoch auch einige Unterschiede zwischen den beiden. Versprechungen sind Werte, die sich auf asynchronous
-Art auflösen lassen, wie http -Aufrufe. Auf der anderen Seite behandeln Observables eine Folge von asynchronen Ereignissen. Die Hauptunterschiede zwischen ihnen sind unten aufgeführt:
Versprechen:
beobachtbar:
Außerdem habe ich unten ein grafisches Bild erstellt, um die Unterschiede visuell darzustellen:
Versprechen
Observables
Ein Operator retry kann verwendet werden, um es bei Bedarf erneut zu versuchen, auch wenn die beobachtbare Variable unter bestimmten Bedingungen erneut versucht werden muss . retryWhen kann verwendet werden.
Hinweis : Eine Liste der Operatoren mit ihren interaktiven Diagrammen finden Sie hier unter RxMarbles.com
In den Antworten fehlt ein Nachteil von Observablen. Versprechen erlauben die Verwendung der ES7-Funktionen für async/await. Mit ihnen können Sie asynchronen Code wie einen synchronen Funktionsaufruf schreiben, so dass Sie keine Rückrufe mehr benötigen. Die einzige Möglichkeit für Observables, dies zu tun, besteht darin, sie in Versprechen umzuwandeln. Wenn Sie sie jedoch in Versprechen konvertieren, können Sie wieder nur einen Rückgabewert haben:
async function getData(){
const data = await observable.first().toPromise();
//do stuff with 'data' (no callback function needed)
}
Lesen Sie weiter: Wie kann ich auf ein Rx Observable "warten"?
Obwohl diese Antwort zu spät ist, habe ich die Unterschiede unten zusammengefasst:
Beobachtbar:
function
, die an observer
verwendet und einen function Observer: an object with next, error.
zurückgibt.subscribe/unsubscribe
zu seinem Datenstrom, emitnext Wert an den Beobachter, notify
den Beobachter über errors
und Den Beobachter über den stream completion
zu informieren.function to handle next value
, Fehler und Ende des Streams (UI-Ereignisse, http-Antworten, Daten mit Web-Sockets).multiple values
im Laufe der Zeitcancel-able/retry-able
und unterstützt Operatoren wie map,filter,reduce
usw.Observable.create()
- Gibt Observable zurück, das Methoden auf -Observer Observable.from()
aufrufen kann - konvertiert ein Array oder iterable in -Observable Observable.fromEvent()
- konvertiert ein event in Observable -Observable.fromPromise()
- wandelt ein Promise in Observable um -Observable.range()
- gibt eine Folge von ganzen Zahlen im angegebenen Bereich zurückVersprechen:
Ein Versprechen stellt eine Aufgabe dar, die in der Zukunft zu Ende gehen wird.
Versprechen werden resolved by a value
;
Versprechen werden durch Ausnahmen abgelehnt;
Nicht cancellable
und gibt a single value
zurück.
Ein Versprechen enthüllt eine Funktion (then)
-then gibt eine neue promise
zurück;
-Läßt die attachment
davon ausgeführt werden, basierend auf state
;
-handlers
sind guaranteed
zur Ausführung in order attached
;
Ich glaube, dass alle anderen Antworten Ihre Zweifel klären sollten ... Trotzdem wollte ich nur hinzufügen, dass Observables auf funktionaler Programmierung basieren, und ich finde die Funktionen, die damit einhergehen, wie map, flatmap, reduz, zip, sehr nützlich. Die Konsistenz, die das Web erzielt, insbesondere wenn es auf API-Anforderungen ankommt, ist eine brutale Verbesserung.
Diese Dokumentation empfehle ich dringend, da es sich um die offizielle Dokumentation von reagierendenX handelt und ich finde es am klarsten.
Wenn Sie in Observables einsteigen möchten, würde ich diesen dreiteiligen Beitrag vorschlagen: http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/
Obwohl es für RxJava gedacht ist, sind die Konzepte gleich und es ist wirklich gut erklärt. In der Dokumentation von interactiveX haben Sie die Äquivalenzen für jede Funktion. Sie müssen nach RxJS suchen.
Ich habe gerade ein Problem angesprochen, bei dem Versprechen die beste Lösung waren, und ich teile es hier für alle, die über diese Frage stolpern, falls sie nützlich ist (dies war genau die Antwort, nach der ich vorher gesucht hatte):
In einem Angular2-Projekt habe ich einen Dienst, der einige Parameter übernimmt und eine Werteliste zurückgibt, um Dropdown-Menüs in einem Formular aufzufüllen. Wenn die Formularkomponente initialisiert wird, muss ich denselben Dienst mehrmals mit verschiedenen Parametern aufrufen, um eine Reihe verschiedener Dropdown-Menüs zu definieren. Wenn ich jedoch einfach alle Variablen in die Warteschlange setze, um den Dienst aufzurufen, ist nur die letzte erfolgreich und der Restfehler aus. Das Abrufen von Diensten aus der Datenbank konnte jeweils nur eine Anforderung verarbeiten.
Die einzige Möglichkeit, alle Dropdown-Menüvariablen erfolgreich aufzufüllen, bestand darin, den Dienst so aufzurufen, dass die Verarbeitung einer neuen Anforderung bis zum Abschluss der letzten Anforderung verhindert wurde und der Promise/.then-Mechanismus das Problem gut gelöst hat.
fetchValueList(listCode): Promise<any> {
return this.dataSvc.getValueList(listCode, this.stateSvc.currentContext, this.stateSvc.currentLanguageCode)
.map(response => response.json())
.toPromise();
}
initializeDropDowns() {
this.fetchValueList('First-Val-List')
.then(data => {
this.firstValList = data;
return this.fetchValueList('Second-Val-List')
}).then(data => {
this.secondValList = data;
return this.fetchValueList('Third-Val-List')
}).then(data => {
this.thirdValList = data;
}) }
Ich habe die Funktionen in der Komponente definiert und dann in ngOnInit initializeDropDowns () aufgerufen.
Die Funktion fetchValueList gibt eine Promise zurück. Daher übergibt der erste Aufruf den ersten listCode. Wenn die Promise aufgelöst wird, befindet sich der Rückgabewert in der Datenvariablen im .then-Block, wo wir ihn der Variablen this.firstValList zuordnen können. Da die Funktion Daten zurückgegeben hat, wissen wir, dass der Dienst abgeschlossen ist und es mit dem zweiten listCode sicher erneut aufgerufen werden kann. Der Rückgabewert befindet sich in der Datenvariablen im nächsten .then-Block, und wir weisen ihn der Variablen this.secondValList zu.
Wir können dies so oft wie nötig verketten, um alle Variablen aufzufüllen, und im letzten Codeblock lassen wir die return-Anweisung einfach weg und der Block wird beendet.
Dies ist ein sehr spezieller Anwendungsfall, in dem wir einen einzelnen Dienst haben, der bei der Initialisierung der Komponente mehrmals aufgerufen werden muss, und in dem der Dienst seinen Abruf abschließen und einen Wert zurückgeben muss, bevor er erneut aufgerufen werden kann. In diesem Fall Die Promise-/Dann-Methode war ideal.
Versprechen - Stellen Sie einen einzigen zukünftigen Wert bereit. Nicht faul . Nicht stornierbar Es wird entweder ablehnen oder auflösen.
Beobachtbar - Stellen Sie mehrere zukünftige Werte bereit. Faul . Abbestellbar Es bieten andere Methoden Live Map, Filter, reduzieren.
Sie können ein Observable immer für den Umgang mit asynchronem Verhalten verwenden, da ein Observable über alle Funktionen verfügt, die ein Versprechen bietet (+ extra). Manchmal wird diese zusätzliche Funktionalität von Observables jedoch nicht benötigt. Dann wäre es ein zusätzlicher Aufwand, eine Bibliothek dafür zu importieren, um sie verwenden zu können.
Verwenden Sie Versprechungen, wenn Sie einen asynchronen single - Vorgang haben, dessen Ergebnis Sie bearbeiten möchten. Zum Beispiel:
var promise = new Promise((resolve, reject) => {
// do something once, possibly async
// code inside the Promise constructor callback is getting executed synchronously
if (/* everything turned out fine */) {
resolve("Stuff worked!");
}
else {
reject(Error("It broke"));
}
});
//after the promise is resolved or rejected we can call .then or .catch method on it
promise.then((val) => console.log(val)) // logs the resolve argument
.catch((val) => console.log(val)); // logs the reject argument
Ein Versprechen führt also Code aus, bei dem es entweder aufgelöst oder abgelehnt wird. Wenn entweder „Auflösen“ oder „Ablehnen“ aufgerufen wird, wechselt das Versprechen von einem ausstehenden Zustand zu einem Aufgelösten - oder Abgelehnt -Zustand. Wenn der Versprechungszustand gelöst ist, wird die then()
-Methode aufgerufen. Wenn der Versprechungsstatus abgelehnt wird, wird die catch()
-Methode aufgerufen.
Verwenden Sie Observables, wenn über die Zeit ein stream (von Daten) vorhanden ist, mit dem Sie umgehen müssen. Ein Stream ist eine Folge von Datenelementen, die im Laufe der Zeit zur Verfügung gestellt werden. Beispiele für Streams sind:
In Observable selbst wird angegeben, wann das next-Ereignis aufgetreten ist, wenn ein error auftritt oder wenn das Observable complete ist. Dann können wir dieses Observable abonnieren, das es aktiviert, und in diesem Abonnement können wir 3 Callbacks übergeben (müssen nicht immer alle übergeben werden). Ein Rückruf, der für Erfolg ausgeführt werden soll, ein Rückruf für Fehler und ein Rückruf für die Fertigstellung. Zum Beispiel:
const observable = Rx.Observable.create(observer => {
// create a single value and complete
observer.onNext(1);
observer.onCompleted();
});
source.subscribe(
x => console.log('onNext: %s', x), // success callback
e => console.log('onError: %s', e), // error callback
() => console.log('onCompleted') // completion callback
);
// first we log: onNext: 1
// then we log: onCompleted
Beim Erstellen eines Observable wird eine Callback-Funktion benötigt, die einen Observer als Argument liefert. Bei diesem Beobachter können Sie dann onNext
, onCompleted
, onError
aufrufen. Wenn das Observable dann abonniert wird, werden die entsprechenden Rückrufe aufgerufen, die an das Abonnement übergeben werden.
Observables und Promises bieten eine Möglichkeit, mit async -Aktivitäten in JavaScript zu arbeiten. Während Promises entweder reject/resolve basierend auf dem Abschluss eines einzelnen asynchronen Ereignisses (http-Anforderung) verspricht, können Observables fortlaufend Statusänderungen basierend auf den beobachtenden Beobachtern ausgeben.
Ein grundlegender Unterschied zwischen ihnen besteht darin, dass die Beobachtbaren Möglichkeiten bieten, eine Anforderung abbrechen und eine neue erneut senden. Wo als Versprechen nicht solche Funktion zulassen.
Promise gibt auch einen einzelnen Wert aus, während Observable mehrere Werte ausgibt. Wenn Sie also eine HTTP-Anfrage bearbeiten, kann Promise eine einzige Antwort für dieselbe Anfrage verwalten. Was passiert, wenn mehrere Antworten auf dieselbe Anfrage vorliegen, müssen Sie Observable verwenden.
const promise = new Promise(resolve => {
setTimeout(() => {
resolve("Hello from a Promise!");
}, 2000);
});
promise.then(value => console.log(value));
Beobachtbares Beispiel jetzt. Auch hier übergeben wir eine Funktion an observable, einen Beobachter, der die asynchrone Aufgabe übernimmt. Im Gegensatz zu Lösung im Versprechen hat es die folgende Methode und abonniert anstelle von dann.
Beide erledigen also asynchrone Aufgaben. Jetzt wollen wir den Unterschied sehen.
const observable = new Observable(observer => {
setTimeout(() => {
observer.next('Hello from a Observable!');
}, 2000);
});
observable.subscribe(value => console.log(value));
Versprechen
Beobachtbar
Im Folgenden sind einige wichtige Unterschiede in Bezug auf Versprechen und Observables aufgeführt.
Versprechen
Beobachtbar
Zum besseren Verständnis lesen Sie die https://stackblitz.com/edit/observable-vs-promises
Die allgemein akzeptierte Antwort ist im Allgemeinen gut, aber ich denke nicht, dass sie betont, dass Sie beim Umgang mit Angular-Komponenten fast immer ein Observable verwenden möchten, da dies die Stornierung unterstützt. Versprechen können nicht storniert werden und werden auch dann gelöst, wenn Ihre Komponente zerstört wird. Angular neigt dazu, zu vergeben, bis es nicht ist.
Beispielsweise verursacht jede manuelle Änderungserkennung einer zerstörten Komponente eine Ausnahme:
ngOnInit() {
// promise api
this.service.getData().then(d => {
this.data = d;
this.changeDetectorRef.detectChanges();
});
// observable api
this.service.getData().pipe(takeUntil(this.unsubscribe)).subscribe((d) => {
this.data = d;
this.changeDetectorRef.detectChanges();
});
}
Wenn Ihre Komponente zerstört wird, bevor das Versprechen aufgelöst wird, erhalten Sie einen attempt to use destroyed view
-Fehler, wenn das Versprechen gelöst wird.
Wenn Sie jedoch Observables mit dem Muster takeUntil verwenden, wird das Abonnement abgebrochen, sobald Ihre Komponente zerstört wird.
Dies ist ein kleines Beispiel, aber die Ausführung von Code für eine Komponente, die zerstört wird, führt wahrscheinlich zu Fehlern. Es sei denn, Sie möchten das aus irgendeinem Grund tatsächlich tun: p
Kurze Antwort :
Beobachtbar istbesser, es hat alle Versprechen Funktionen plus zusätzliche Funktionen.
Lange Antwort:
Versprechen:
Beobachtbar:
Ich sehe viele Leute, die das Argument verwenden, dass Observable "stornierbar" ist, aber es ist ziemlich trivial, Promise "stornierbar" zu machen.
function cancellablePromise(body) {
let resolve, reject;
const promise = new Promise((res, rej) => {
resolve = res; reject = rej;
body(resolve, reject)
})
promise.resolve = resolve;
promise.reject = reject;
return promise
}
// Example 1: Reject a promise prematurely
const p1 = cancellablePromise((resolve, reject) => {
setTimeout(() => resolve('10', 100))
})
p1.then(value => alert(value)).catch(err => console.error(err))
p1.reject(new Error('denied')) // expect an error in the console
// Example: Resolve a promise prematurely
const p2 = cancellablePromise((resolve, reject) => {
setTimeout(() => resolve('blop'), 100)
})
p2.then(value => alert(value)).catch(err => console.error(err))
p2.resolve(200) // expect an alert with 200
Versprechen:
Asynchrone Ereignisbehandlungsroutine - Das Promise-Objekt repräsentiert den endgültigen Abschluss (oder Fehler) einer asynchronen Operation und den daraus resultierenden Wert.
Syntax: new Promise (Testamentsvollstrecker);
zB:
var promise_eg = new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('foo');
}, 300);
});
promise_eg.then(function(value) {
console.log(value);
// expected output: "foo"
});
console.log(promise_eg);
About Promise: Es hat eine Pipeline, daher gibt es Werte nur einmal zurück, wenn es aufgerufen wird. Der so genannte One-Way-Handler kann möglicherweise nicht storniert werden. nützliche Syntax zum Herumspielen, when () und then ()
Observables:
Observables sind langsame Sammlungen mit mehreren Werten im Zeitverlauf. Es ist wirklich ein großartiger Ansatz für asynchrone Operationen. es kann mit rxjs gemacht werden, das plattformübergreifende Unterstützung hat, kann mit eckigen/reagieren usw.
es wirkt wie ein Stream Liner. kann Multi-Pipeline sein. Sobald dies definiert ist, können Sie es abonnieren, um an vielen Stellen Ergebnisse zu erhalten.
Syntax: import * as Rx from "@reactivex/rxjs";
to init:
Rx.Observable.fromEvent(button, "click"),
Rx.Subject()
usw
zu abonnieren: RxLogger.getInstance();
zB:
import { range } from 'rxjs';
import { map, filter } from 'rxjs/operators';
range(1, 200).pipe(
filter(x => x % 2 === 1),
map(x => x + x)
).subscribe(x => console.log(x));
da es Multi-Pipeline unterstützt, können Sie das Ergebnis an einem anderen Ort abonnieren, es hat viele möglichkeiten als versprechen.
Verwendung: es hat mehr Möglichkeiten wie map, filter, pipe, map, concatMap etc
Etwas, auf das ich gestoßen bin, war aus der ersten Lektüre des Tutorials nicht ersichtlich, und die Dokumentation war die Idee des Multicasting.
Stellen Sie sicher, dass Sie wissen, dass standardmäßig mehrere Abonnements mehrere Ausführungen in einem Observable auslösen. Mehrere Subskriptionen für einen einzelnen HTTP-Aufruf Observable löst mehrere identische HTTP-Aufrufe aus, sofern Sie nicht .share()
(Multicasting aktivieren).
Ein Versprechen zwingt Sie, sich jeweils mit einer Sache zu befassen, ihre Daten auszupacken, Ausnahmen zu behandeln, Sprachunterstützung für coole Dinge wie async/await zu erhalten und ist ansonsten ziemlich barebones.
Ein Observable hat viele Glocken und Pfeifen, aber Sie müssen wissen, mit welcher Kraft Sie arbeiten, oder es kann missbraucht werden.
Sowohl Promises als auch Observables helfen uns beim Umgang mit asynchronen Operationen. Sie können bestimmte Rückrufe aufrufen, wenn diese asynchronen Vorgänge ausgeführt werden.
Angular verwendet Observables von RxJS anstelle von Versprechungen für den Umgang mit HTTP
Below are some important differences in promises & Observables.