2016-04-10 14 views
1

Gibt es eine Möglichkeit, einen Stream basierend auf der Ausgabe eines anderen Streams abzubrechen/zu ignorieren/zu unterbrechen?Ströme ignorieren/unterbrechen/unterbrechen in Funktionsreaktive Programmierung?

Der Anwendungsfall ist, dass ich drei Ströme haben:

  1. loginStream - Benutzer gibt anmelden creds und klickt einreichen. Emits Login-Credits.
  2. authorizeStream- System versucht den Benutzer zu autorisieren. Erzeugt ein Token.
  3. logoutStream - Benutzer drückt den Logout-Button

Der gemeinsame Fall ist --- der Benutzer anmeldet, das System zu autorisieren versucht, an einem gewissen Punkt in der Zukunft sich der Benutzer abmeldet. Das ist ziemlich Standard FRP.

Der Rand Fall ist --- Benutzer meldet sich aber sofort ab, bevor er autorisiert ist.

Um zu verhindern, dass das System in einen seltsamen Zustand übergeht, muss ich in diesem speziellen Fall den Autorisierungsdatenstrom ignorieren. Das einzige, was ich mir vorstellen kann, ist (1) die drei Ströme zusammenführen, (2) Zustand über einen Scan verfolgen, (3) Logout setzt den Zustand auf logout, login setzt den Status auf login. Filtern Sie ein Autorisierungsereignis aus, wenn Sie nicht in login sind.

merge([loginStream, authorizeStream, logoutStream]) 
    .scan((state, event) => event.type !== 'auth' ? {state: event.type, event} : {state, event}, {}) 
    .filter(event => !(event.state !== 'login' && event.event.type === 'auth')) 

Der obige Ansatz sollte funktionieren, aber ich frage mich, ob es ein sauberes ist „mehr FRP“ Weg, um die authorizationStream zu ignorieren.

Antwort

2

emittiert Dieser Strom nach login, und erst vor logout:

loginStream.flatMapLatest(() => { 
    return authorizeStream.take(1).takeUntilBy(logoutStream); 
}) 

Je nach Fall, Sie .take(1) Teil weglassen können mehrere autorisiert für eine Anmeldung

+0

'flatMapLatest' ist' switchMap' zu ermöglichen in Rxjs 5, wenn ich mich nicht irre. – weltschmerz

0

takeUntil sagt "Beenden Sie die Ausgabe von Ergebnissen aus diesem Stream, wenn ein Element von diesem anderen Stream emittiert wird", was ich denke, was Sie hier wollen. nur