2015-08-17 46 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实例。