2016-07-23 29 views
2

Lassen Sie uns die folgende vereinfachte Situation berücksichtigen:Filter eine beobachtbare durch eine beobachtbare

  • Wir haben eine beobachtbare Äpfel vom Typ beobachtbare < Apfel>
  • Jedes Apple-Objekt verfügt über eine Methode isRotten(), die gibt einen beobachtbaren von Typ Observable < Boolean> welcher garantiert mindestens einen booleschen Wert ausgibt.

Ich möchte die beobachtbaren Äpfel so filtern, dass die faulen Äpfel den Filter nicht passieren. Genauer gesagt, ein Apfel A passiert den Filter genau dann, wenn der erste von A.isRotten() ausgegebene Gegenstand falsch ist. Was ist der beste Weg, diesen Filter zu implementieren?

Nach einiger Überlegung konnte ich mit diesem kommen:

apples 
    .concatMap(apple => 
     apple.isRotten() 
      .first() 
      .filter(bool => bool) 
      .map(bool => apple)) 

, die in Javascript geschrieben. (... => ... ist eine Funktion). Das funktioniert, aber ich denke, es ist ziemlich lang und schwer zu verstehen. Gibt es einen besseren Weg, um so etwas zu tun?

Antwort

2

Was du hast, sind in Ordnung und TBH, ich nicht von einer prägnanten Art und Weise, es zu tun denken. Ich würde wahrscheinlich flatMap anstatt concatMap verwenden, wenn Out-of-Order-Äpfel kein Problem sind.

Wenn Lesbarkeit ein Problem für Sie ist, bewegen sich nur die Umsetzung in es ist eine Funktion (zB. filterObservable, die eine Funktion übernimmt, die einen Wert nimmt und gibt ein IObservable<bool>)

+0

Danke für deine Antwort, ich habe gehofft, dass etwas wie filterObservable existiert. Aber ich denke, ich muss es selbst implementieren. –

-2

Sie können etwas tun:

var seq = Rx.Observable.from([1, 2, 3, 4, 5, 6]) 
    .filter(x => { 
     let isRotten = true; 
     Rx.Observable.just(x % 2 === 0) 
      .first() 
      .subscribe(val => isRotten = val); 

     if (isRotten) { 
      return x; 
     } 
    }); 

seq.subscribe(x => console.log(x)); 
+0

Bist Du sicher? Ich glaube nicht, dass das funktioniert, weil x.isRotten() keinen Boolean zurückgibt, sondern ein Observable, das Booleans ausgibt. –

+0

Ich habe die folgende Geige gemacht, es überprüft, dass der Filteroperator nicht mit Observables funktioniert. http://jsfiddle.net/pgcrwauj/ –

+0

@WardBeullens Siehe den aktualisierten Code. Ich habe deine Frage zuerst nicht bekommen. –