我希望有多个订阅以响应可观察到的事件,但是我也想记录该事件,因此我将其通过do()
运算符通过管道进行记录。
问题是,我创建的每个订阅都会记录一次该事件!
此刻,我正在通过创建Subject
并从事件回调中调用next
来解决此问题,这使我可以记录一次事件并触发多个订阅。 / p>
以下代码演示了此问题:https://stackblitz.com/edit/rxjs-xerurd
我有一种想念的东西,不是有更多的“ RxJS”方式吗?
编辑:
我不是要问可热观测和冷观测之间的区别,实际上我使用的是热观测-由fromEvent()
创建的一个,并且想知道为什么我推测为热的事件源表现得很冷。
我现在意识到-在读完share()
之后-pipe()
“转变”了您可观察到的感冒,即根据您的来源(可能是冷的,可能是热的)返回了感冒。
答案 0 :(得分:2)
由于默认情况下可观察的序列很冷,因此每个订阅将具有一组单独的站点效果。
如果您希望只执行一次副作用-您可以通过向多个订阅者广播单个订阅来共享订阅。为此,您可以使用share
,shareReplay
等
要更好地理解它的工作原理,什么是“冷”并发布,请参考RxJS v4文档:
答案 1 :(得分:1)
EDIT:share()
终于可以工作了。请看下面的评论。感谢@Oles Savluk。
我让我在下面的答案中作记录。可能会有帮助。
share()
和多播内容无法解决我非常相似的问题。
这是我解决的方法:https://stackblitz.com/edit/rxjs-dhzisp
const finalSource = new Subject();
fromEvent(button3, "click").pipe(
tap(() => {
console.log("this happens only once")
})
).subscribe(() => finalSource.next())
finalSource.subscribe(
() => console.log("first final subscription")
)
finalSource.subscribe(
() => console.log("second final subscription")
)
finalSource.subscribe(
() => console.log("third final subscription")
)