2016-07-23 172 views
2

讓我們看看下面的簡單情況:過濾器可觀察到的由可觀察到的

  • 我們有類型的可觀察到的蘋果可觀察<蘋果>
  • 每個蘋果對象有一個方法isRotten()返回一個可觀察的type Observable < Boolean>保證至少發出一個布爾值。

我想過濾可觀察到的蘋果,使腐爛的蘋果不通過過濾器。更確切地說,當且僅當A.isRotten()發出的第一項爲false時,蘋果A纔會通過過濾器。什麼是實現這個過濾器的最佳方式?

經過一番思考,我可以想出這樣的:

這是用JavaScript編寫的
apples 
    .concatMap(apple => 
     apple.isRotten() 
      .first() 
      .filter(bool => bool) 
      .map(bool => apple)) 

。 (... => ...是一個函數)。這是有效的,但我認爲這是相當冗長和難以理解的。有沒有更好的方式來做這種事情?

回答

2

你有什麼是罰款,TBH,我想不出做的更簡潔的方式。如果無序蘋果不是問題,我可能會使用flatMap而不是concatMap

如果可讀性是你的一個問題,只需將執行到它的一個功能(如:filterObservable接受一個函數,它的值,並返回一個IObservable<bool>

+0

感謝您的回答,我希望像filterObservable這樣的東西存在。但我想我必須自己實現它。 –

-2

你可以做這樣的事情:

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

你確定嗎?我不認爲這是有效的,因爲x.isRotten()不返回布爾值,它返回一個發佈布爾值的Observable。 –

+0

我做了下面的提琴,它驗證過濾器運算符不能使用Observables。 http://jsfiddle.net/pgcrwauj/ –

+0

@WardBeullens請參閱最新的代碼。起初我沒有聽到你的問題。 –