簡體   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