Wie der "flatmap" Betreiber bedingt ? (Winkel 2/rxjs)
Was ich versuche zu erreichen, laufen eine Reihe von observablen bedingt.
return observable.map(response => response)
.flatmap(response1 => observable1(response1))
.flatmap(response2 => observable2(response2))
.flatmap(response3 => observable3(response3))
Ich brauche, um zu überprüfen, die response1 und berufen sich auf die restlichen observablen, wenn nötig, sonst muss ich zurück response1 und brechen die Ausführung und so weiter.
Ich durchgemacht habe folgende Fragen, aber Sie nicht scheinen, um meine Frage zu beantworten
Bedingt wählen, erkennbar im RxJS
RXJS wenn mit beobachtbaren bedingten
Handle Fehler in RxJs flatMap stream und die Verarbeitung fortzusetzen
Ich bin neu rxjs, so verzeihen Sie mir, wenn die Frage scheint mir zu lahm.
Jede Hilfe wird geschätzt.
Dank
- Was ist die Bedingung für? Ist es statisch, hängt es ab
response
, bedeutet die zweite Bedingung abhängigresponse2
etc? - ja, der Zustand ist statisch, die zweite Bedingung hängt von der
response2
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist, wie der Aufruf, mehrere aufeinander folgende HTTP-Anfragen, wo die Ergebnisse hängen von einander ab. Dies ist, wo Sie verwenden möchten
concatMap()
statt, weil es warten, bis der Beobachtbaren zurückgegeben, die von der callback-Funktion abgeschlossen ist.Es ist schwer zu sagen, was genau Sie wollen zu tun, von deiner Beschreibung, aber wenn Sie benötigen, um mit der Propagierung der Ergebnisse (und vermeiden, fordern Sie unnötige HTTP-requests) haben Sie einen Blick
takeWhile()
Betreiber oder einfachfilter()
Betreiber.Mit
filter()
:Das einfach nicht vermehren, das Element weiter, wenn es nicht die
filter
test. Allerdings wird die Quelleobservable
können noch emittieren Werte, die gehen durch die Kette. In anderen Worten, diefilter
Betreiber nicht die komplette Kette.Mit
takeWhile()
:Wenn eine der
takeWhile()
Ergebnis in false, es wird schließen Sie die Kette, und kein anderer Wert kann emittiert werden.concatMap
und dieflatMap
dass die OP wird mit Hilfe?observable2
wennresponse1
ist einen bestimmten Wert und zurückresponse1
oder anderes laufenobservable2
und so weiterfilter()
odertakewhile()
Könnte man etwas machen wie:
Sind es nur zwei Anrufe, aber Sie erhalten den Punkt.
Observable.empty()
wenn Sie möchten, dass die streams sofort vollständig da. Sie können nicht nur nicht wieder einige beobachtbare Sache, diese verursachen einen Laufzeitfehler.Habe ich nicht gefunden, einfach Weg zu umgehen-Betreiber, wenn Sie sich entscheiden, Sie zu überspringen n letzten Betreiber, das Sie noch zu Durchlaufen haben, die Letzte gültige Antwort, die durch alle Betreiber:
Alternativ können Sie kombinieren alle observablen in einem einzigen beobachtbaren und abonnieren, die, wie unten,
Abonnieren Sie mit
Immer noch Sie zugreifen können jeweils separat mit der
response2
undresponse3
benannte Instanz.Abonnieren für ein einzelnes Objekt mit verschiedenen observablen:
Wenn Sie auf der Suche zu kombinieren, Daten und Eigenschaften aus verschiedenen observablen können Sie einen Blick auf diese Antwort
observable2
wenn ich das will.observable2
wenn dieresponse1
ist ein bestimmter Wert oder zurückresponse1
wenn es einen anderen Wert, ohne Verschachtelung