![](/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.