2015-08-17 241 views
0

我有一個可觀察對象和另一個可觀察對象,它提供了一個更改密鑰 。 我想構建一個觀察值,基於該鍵在對象中的可觀察值之間切換。基於可觀察性,從可觀察對象中選擇可觀察對象

例子:

// Choose randomly between "up" or "down" every second 
const upOrDown$ = Rx.Observable.interval(1000).publish().refCount() 
        .map(() => Math.random() < 0.5 ? "up" : "down") 

const myMap = 
    { "up" : Rx.Observable.interval(100).publish().refCount().map("foo") 
    , "down" : Rx.Observable.interval(100).publish().refCount().map("bar") 
    } 

upOrDown$.flatMap(ud => myMap[ud]).subscribe(x => console.log(x)); 

不幸的是,打算在不工作。 我預計在一秒的時間內,要麼foo要麼bar被髮射,而不是兩者。

任何想法?

回答

1

問題是,當生成一個新的序列時,你永遠不會結束以前的序列。這將在第一秒實際正確運行,但在此之後,當外部間隔再次發射時,前一個鏈不會被取消,因此您開始接收兩個流。您可能正在尋找flatMapLatest而不是flatMap。一旦新事件從外部進入,前者將處理當前的內部流。

upOrDown$.flatMapLatest(ud => myMap[ud]).subscribe(x => console.log(x)); 

我真的不知道,如果你內心的來源將是熱或冷,但如果是後者,你還可以刪除publish().refCount()take(count)而不是取代它,這將是切斷的另一種方式流。

最後,作爲一個業績說明,我會建議你做publish().refCount()作爲唯一的直接用戶會收到在這種情況下廣播的好處是你把儘可能多的邏輯之前,加入map()運營商它的結束意味着在引擎蓋下隱式地爲您製作的每個訂閱創建一個新的MapObservable實例。