簡體   English   中英

為什么在首次訂閱熱門可觀察節目后訂閱未觸發

[英]Why subscription not firing after first subscribe for a hot observable

在我的代碼中,我使用share()創建了一個可觀察的熱點,如果我沒有完成observable,或者使用setTimeout使它異步,則僅執行第一個訂閱,之后將不再執行任何其他訂閱。 這是預期的行為嗎?

const c=Rx.Observable.create((obs)=>{
obs.next(1)
// add this will work
// setTimeout(()=>obs.next(1),1000)
// add this will work too
// obs.complete()
}).share()

// excuted
c.subscribe(()=>console.log('first subscribe'))
// not excuted
c.subscribe(()=>console.log('second subscribe'))

如果我改為使用發布連接方法,則可以按預期工作。

const c=Rx.Observable.create((obs)=>{
obs.next(1)
}).publish()

// excuted
c.subscribe(()=>console.log('first subscribe'))
// excuted
c.subscribe(()=>console.log('second subscribe'))
c.connect()

的jsfiddle

讓我們逐步講解示例。

Rx.Observable.create((obs)=>{
  obs.next(1)
})

這將創建一個可觀察的對象,並在您請求訂閱時執行傳遞給您的create函數。

.share()

這共享上游訂閱。 這意味着第一個訂閱者進行share創建對源的訂閱,而所有后續訂閱者共享(如此!)。 如果所有訂閱者都取消其訂閱,則也將取消對源的訂閱。 請注意,流完成之前也會創建新的訂閱。

c.subscribe(()=>console.log('first subscribe'))

第一個訂閱者進行訂閱, share操作員創建一個共享訂閱。 因此,執行預訂功能並發出一個值。

c.subscribe(()=>console.log('second subscribe'))

第二個訂閱者進行訂閱, share操作員重新使用對源的現有訂閱。 因此, 執行訂閱功能,並且不發出任何值。

如果將.unsubscribe()添加到第一個subscribe則它將按預期工作,因為共享訂閱已取消,第二個訂閱者導致了該訂閱函數的另一次執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM