基于可观察性,从可观察对象中选择可观察对象

时间:2015-08-17 17:53:18

标签: javascript rxjs

我有一个可观察对象和另一个可观察对象 一把改变的钥匙。 我想构建一个在它之间切换的observable 基于该键的对象中的可观察对象。

示例:

// 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会被发出,而不是两者。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

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

我实际上并不知道您的内心来源是热还是冷,但如果它们是后者,您也可以删除publish().refCount()并将其替换为take(count),这样就可以了是另一种切断流的方式。

最后作为效果说明,我建议您在<{>> 之前添加尽可能多的逻辑,因为在这种情况下,只有直接订阅者才能获得广播的好处, publish().refCount()运算符到它的末尾意味着你隐藏了为你做的每个订阅创建一个新的map()实例。