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

Mar*_*ski 5 javascript reactive-programming rxjs

我想有多个订阅来对一个可观察的事件做出反应,但我也想记录该事件,所以我通过一个do()操作员来记录它。

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

我目前正在通过创建 aSubjectnext从事件回调中调用它来解决这个问题,这允许我记录一次事件并触发多个订阅。

以下是一些演示该问题的代码:https : //stackblitz.com/edit/rxjs-xerurd

我有一种感觉,我错过了一些东西,难道没有更“RxJS”的方式来做到这一点吗?

编辑:

我不是在要求区分热和冷可观察量,实际上我使用的是热可观察量 - 由它创建fromEvent()并想知道为什么我可能的热事件源表现得像冷的一样。

我现在意识到 - 在阅读之后share()- 这pipe()会“改变”你可观察到的寒冷,即根据你的来源(可能是冷的,可能是热的)返回一个冷的

Ole*_*luk 5

因为 Observable 序列默认是冷的,所以每个订阅都会有一组单独的站点效果。

如果您希望只执行一次副作用 - 您可以通过向多个订阅者广播单个订阅来共享订阅。要做到这一点,你可以使用shareshareReplay等等。

为了更好地理解它是如何工作的,什么是“冷”和发布,请参阅 RxJS v4 文档:

4.8 使用发布操作符来分享副作用