在RxJS中,为什么管道对每个订阅执行一次?

时间:2018-10-18 13:05:00

标签: javascript rxjs reactive-programming

我希望有多个订阅以响应可观察到的事件,但是我也想记录该事件,因此我将其通过do()运算符通过管道进行记录。

问题是,我创建的每个订阅都会记录一次该事件!

此刻,我正在通过创建Subject并从事件回调中调用next来解决此问题,这使我可以记录一次事件并触发多个订阅。 / p>

以下代码演示了此问题:https://stackblitz.com/edit/rxjs-xerurd

我有一种想念的东西,不是有更多的“ RxJS”方式吗?

编辑:

我不是要问可热观测和冷观测之间的区别,实际上我使用的是热观测-由fromEvent()创建的一个,并且想知道为什么我推测为热的事件源表现得很冷。

我现在意识到-在读完share()之后-pipe()“转变”了您可观察到的感冒,即根据您的来源(可能是冷的,可能是热的)返回了感冒。

2 个答案:

答案 0 :(得分:2)

由于默认情况下可观察的序列很冷,因此每个订阅将具有一组单独的站点效果。

如果您希望只执行一次副作用-您可以通过向多个订阅者广播单个订阅来共享订阅。为此,您可以使用shareshareReplay

要更好地理解它的工作原理,什么是“冷”并发布,请参考RxJS v4文档:

4.8 Use the publish operator to share side-effects

答案 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")
)