繁体   English   中英

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

[英]In RxJS, why does a pipe get executed once for each subscription?

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

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

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

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

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

编辑:

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

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

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

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

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

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

编辑: 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")
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM