![](/img/trans.png)
[英]RxJS, why does fromEvent() register a new event for each subscription?
[英]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 序列默认是冷的,所以每个订阅都会有一组单独的站点效果。
如果您希望只执行一次副作用 - 您可以通过向多个订阅者广播单个订阅来共享订阅。 为此,您可以使用share
、 shareReplay
等。
为了更好地理解它是如何工作的,什么是“冷”和发布,请参阅 RxJS v4 文档:
编辑: 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.