作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个可观察对象和另一个提供的可观察对象改变 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/
我是一名优秀的程序员,十分优秀!