基于observable,从一个observable对象中选择observable

Based on observable, choose observable out of an object of observables

我有一个可观察对象和另一个可观察对象 一个改变的钥匙。 我想构建一个在 基于该键的对象中的可观察对象。

示例:

// 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));

不幸的是,这没有按预期工作。 我希望在一秒钟的时间内,发出 foobar 而不是两者都发出。

有什么想法吗?

问题是在生成新序列时,您永远不会结束以前的序列。这实际上会在第一秒正确 运行 ,但之后当外部间隔再次发出时,前一个链不会被取消,因此您开始接收两个流。您可能正在寻找 flatMapLatest 而不是 flatMap。前者会在外部事件传入新事件时立即处理当前内部流。

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

我实际上不知道你的内部资源是热的还是冷的,但如果是后者,你也可以删除 publish().refCount() 并用 take(count) 代替,这将另一种断流方式

最后,作为性能说明,我建议您将尽可能多的逻辑 放在 之前 publish().refCount(),因为只有直接订阅者才能从广播中受益在这种情况下,将 map() 运算符添加到它的末尾意味着您在幕后隐式地为您进行的每个订阅创建一个新的 MapObservable 实例。