Ich habe eine RxJS5-Pipeline sieht so aus
%Vor%Ich möchte das Abonnement behalten, bis ich 4 sehe, aber ich möchte auch das letzte Element 4 im Ergebnis enthalten. Also sollte das obige Beispiel
sein %Vor% Gemäß dem offiziellen Dokument , takeWhile
Operator ist nicht inklusive. Das heißt, wenn es auf das Element trifft, das nicht mit dem Prädikat übereinstimmt, das wir angegeben haben, vervollständigt es den Strom sofort ohne das letzte Element. Als Ergebnis wird der obige Code tatsächlich
Also meine Frage ist, was ist der einfachste Weg, um takeWhile
zu erreichen, sondern auch das letzte Element mit RxJS zu emittieren?
Es gibt mindestens zwei mögliche Problemumgehungen:
mit concatMap()
:
Verwenden von multicast()
:
Ich habe diesen Operator ebenfalls verwendet, also habe ich es mit meinen eigenen zusätzlichen RxJS 5-Operatoren gemacht: Ссылка
Dieser Operator wurde auch im RxJS 5-Problem diskutiert: Ссылка
Wenn Ihr Vergleich so ist, dass Sie genau wissen, was das letzte Element ist (wie für !==
), können Sie es selbst wieder hinzufügen:
Ich stieß auf das gleiche Problem, ich brauchte das letzte Element, das enthalten war, also entschied ich mich, einen Verweis auf das Abonnement zu behalten und im onNext
Callback abzubestellen wenn die Bedingung erfüllt wurde. Mit Ihrem Beispielcode wäre es:
Dies funktionierte für mich, weil es auch dazu führte, dass die beobachtbare Quelle aufhört zu emittieren, was ich in meinem Szenario brauchte.
Mir ist klar, dass ich nicht takeWhile
operator benutze, aber das Hauptziel ist erreicht und ohne Workarounds oder zusätzlichen Code.
Ich bin kein Fan davon, Dinge auf eine Weise zu zwingen, für die sie nicht gedacht sind.
Die Nachteile davon sind:
onCompleted
wird aus irgendeinem Grund nicht aufgerufen, wenn der letzte Beobachter sich abmeldet, aber ich habe überprüft, dass die Quelle tatsächlich aufhört zu senden. Tags und Links rxjs reactive-programming rxjs5