作者热门文章
- html - 我的下拉菜单的内容关闭得太快
- c# - 使用 Html Agility Pack 从网页中的表中获取值而不使用 "SelectNode'
- html - 内容容器下的 CSS 下拉菜单
- html - 如何停止嵌套列表重叠父列表?
我有一个可观察对象和另一个提供的可观察对象改变 key 。我想构建一个在之间切换的可观察对象基于该键的对象中的可观察值。
示例:
// 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
被发出,而不是两者都发出。
有什么想法吗?
最佳答案
问题在于,当生成新序列时,您永远不会结束先前的序列。这实际上会在第一秒正确运行,但之后当外部间隔再次发出时,前一个链不会被取消,因此您开始接收两个流。您可能正在寻找 flatMapLatest
而不是 flatMap
。一旦有新事件从外部流传入,前者将立即处理当前的内部流。
upOrDown$.flatMapLatest(ud => myMap[ud]).subscribe(x => console.log(x));
我实际上不知道你的内部来源是热还是冷,但如果是后者,你也可以删除 publish().refCount()
并将其替换为 take(count)
相反,这将是切断流的另一种方式。
最后,作为性能说明,我建议您在执行 publish().refCount()
之前放置尽可能多的逻辑,因为只有直接订阅者才会收到在这种情况下,广播的好处是,将 map()
运算符添加到其末尾意味着您在幕后隐式为每个订阅创建一个新的 MapObservable
实例你做的。
关于javascript - 基于 observable,从 observable 对象中选择 observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32056710/
我是一名优秀的程序员,十分优秀!