RxJS takeWhile aber den letzten Wert enthalten

9

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

ausgeben %Vor%

Also meine Frage ist, was ist der einfachste Weg, um takeWhile zu erreichen, sondern auch das letzte Element mit RxJS zu emittieren?

    
Fang-Pen Lin 19.06.2017, 23:04
quelle

3 Antworten

12

Es gibt mindestens zwei mögliche Problemumgehungen:

  1. mit concatMap() :

    %Vor%
  2. Verwenden von multicast() :

    %Vor%

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: Ссылка

    
martin 20.06.2017, 05:06
quelle
3

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:

%Vor%     
Federico Galassi 20.06.2017 05:43
quelle
0

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:

%Vor%

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:

  • Wenn andere Beobachter abonniert sind, wird die Quelle weiterhin senden.
  • Das 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.
Mauricio Quiroga 30.01.2018 01:06
quelle