gpt4 book ai didi

javascript - 基于 observable,从 observable 对象中选择 observable

转载 作者:行者123 更新时间:2023-12-03 09:11:53 27 4
gpt4 key购买 nike

我有一个可观察对象和另一个提供的可观察对象改变 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));

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

有什么想法吗?

最佳答案

问题在于,当生成新序列时,您永远不会结束先前的序列。这实际上会在第一秒正确运行,但之后当外部间隔再次发出时,前一个链不会被取消,因此您开始接收两个流。您可能正在寻找 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com