2016-01-11 65 views
4

我想用Rx.Observable.if運行兩個可觀察對象之一,如果條件可觀察對象解析爲真或假。RXJS如果以可觀察條件作爲條件

我想實現看起來是這樣的內容:

Rx.Observable.if(conditionalObservable.map(x => x.length > 0), firstObservable, secondObservable).subscribe() 

如果conditionalObservable發送下一個,然後用真實值完成,firstObservable應該運行否則,secondObservable應該運行。

現在很明顯,這是行不通的,因爲Rx.Observable.if需要一個函數有條件的,而不是可觀察的。我如何在RXJS中實現完全相同的功能?

注:This issue幾乎是相同的,但我不認爲這是不夠簡潔,因爲1)你必須有兩個pausable聲明和2),除非你追加一個take(1)到您的觀測條件,你不能保證條件不會發射更多的下一個事件。海事組織這是一個解決方法,並受到更多的人爲錯誤。

回答

2

如果我沒有理解好了,你可以嘗試這樣的事情:

conditionalObservable.map(x => x.length > 0) 
    .last() 
    .flatMap(function(condition){ 
     return condition ? firstObservable : secondObservable}); 
    .subscribe() 

我加入了last一部分,因爲你提到,你要選擇你觀察到的conditionalObservable最後的值(第一或第二)。

我不確定這裏的if運算符的值,因爲它根據必須由選擇器函數同步生成的標量值進行切換。所以除非你使用該函數返回一個可以在閉包中訪問的變量,並且可以在你的條件被評估的地方進行修改,否則在我看來這並不是那麼有用。即使如此,你的選擇器變成了一個不純的函數,這對於測試目的來說並不是最佳實踐。

0

如何使用switch

conditionalObservable 
    .map(x => x.length > 0 ? firstObservable : secondObservable) 
    .switch() 
    .subscribe(...) 

flatMapLatest?如果我很好地理解文檔,這將與前者相同:

conditionalObservable 
    .flatMapLatest(x => x.length > 0 ? firstObservable : secondObservable) 
    .subscribe(...)