RxJS Sequenz äquivalent zu Versprechen.dann()?
Ich verwendet, um eine Menge mit Versprechen und jetzt bin ich bewegt, um RxJS. Der doc RxJS nicht geben ein sehr klares Beispiel, wie man von Versprechen Kette Beobachter Sequenz.
Zum Beispiel, Schreibe ich normalerweise Versprechen Kette mit mehreren Schritten, wie
//a function that returns a promise
getPromise()
.then(function(result) {
//do something
})
.then(function(result) {
//do something
})
.then(function(result) {
//do something
})
.catch(function(err) {
//handle error
});
Wie soll ich umschreiben, dieses Versprechen Kette in der RxJS Stil?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für den Fluss der Daten (entspricht
then
):Versprechen kann umgewandelt werden in eine beobachtbare mit
Rx.Beobachtbar ist.fromPromise
.Einige Versprechen die Betreiber haben eine direkte übersetzung. Zum Beispiel
RSVP.all
oderjQuery.when
kann ersetzt werden durchRx.Observable.forkJoin
.Beachten Sie, dass Sie haben eine Reihe von Operatoren, die es erlaubt, Daten zu transformieren asynchron, und Aufgaben, die Sie nicht oder wäre sehr schwer zu tun mit verspricht. Rxjs enthüllt alle Ihre Kräfte mit asynchronen Sequenzen von Daten (Sequenz, D. H. mehr als 1 asynchrone Wert).
Für Fehler-management, das Thema ist ein wenig komplexer.
retryWhen
kann auch helfen, Sie zu wiederholen einer Sequenz im Falle eines FehlersonError
Funktion.Für präzise Bedeutung, einen tieferen Blick in die Dokumentation und Beispiele finden Sie auf der web -, oder konkrete Fragen stellen hier.
Dies würde auf jeden Fall ein guter Ausgangspunkt für tiefer gehen in Fehler-management mit Rxjs : https://xgrommx.github.io/rx-book/content/getting_started_with_rxjs/creating_and_querying_observable_sequences/error_handling.html
Promise.then
ist eher.flatMap
als.map
.then
waren wieder verspricht, damit dieflatMap
flatMap
funktioniert nur für die Verkettung, wenn Ihre Quelle emittiert, mindestens ein ElementflatMap
ist unabhängig davon, ob es Werte gibt, emittiert. Es ist wie zu sagen, dass eine Funktion nicht funktioniert, bis es angewendet wird, mit einigen Parametern.flatMap
ist nur eine höhere Ordnung, die stream-Funktion.Promise
version Fehler aus der 3.then
würde sein gefangen durch diecatch
. Hier sind Sie nicht.Eine moderne alternative:
Beachten Sie auch, dass für all dies funktioniert, müssen Sie
subscribe
dieser geleitetObservable
irgendwo, aber ich nehme an, es behandelt in einigen anderen Teil der Anwendung.mergeMap()
daher nicht wirklich etwas zu merge, ich denke, wir konnten erreichen genau das gleiche in diesem Fall mitconcatMap()
oderswitchMap()
. Habe ich das richtig...?Update Mai 2019, mit RxJs 6
Stimmen mit den zur Verfügung gestellten Antworten vor, wünschte, fügen Sie ein konkretes Beispiel mit einige Spielzeug-Daten - & einfache Versprechen (mit setTimeout) mit RxJs v6 hinzufügen Klarheit.
Aktualisieren Sie einfach die übergebene id (derzeit hart codiert als
1
), um etwas, das nicht vorhanden ist, der zum ausführen der Logik zur Fehlerverarbeitung zu. Wichtig ist, auch beachten Sie die Verwendung vonof
mitcatchError
Nachricht.Output-Daten:
Den wichtigsten Teil, entspricht der folgende mit klarem Versprechen Ablaufsteuerung:
wenn
getPromise
Funktion ist in einer Mitte einer stream pipe, sollten Sie einfach wickeln Sie es in eine der FunktionenmergeMap
,switchMap
oderconcatMap
(in der RegelmergeMap
):wenn Sie möchten, starten Sie Ihren stream mit
getPromise()
dann wickeln Sie es infrom
Funktion:Soweit ich gerade herausgefunden, wenn man wieder ein Ergebnis in einer flatMap, wandelt es in ein Array, auch wenn Sie wieder einen string.
Aber wenn Sie wieder eine Beobachtbare, dass das beobachtbare können einen string zurückgeben;
Wenn ich das richtig verstanden habe, meinen Sie konsumieren die Werte, die Sie verwenden sbuscribe d.h.
Darüber hinaus können Sie einfach drehen Sie die beobachtbaren ein Versprechen mit toPromise (), wie gezeigt:
Dies ist, wie ich es Tat.
Zuvor
Nach(ly?)