在我的代码中我使用share()创建了一个热的observable,如果我没有完成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()
答案 0 :(得分:1)
让我们一步一步地看一下这个例子。
Rx.Observable.create((obs)=>{
obs.next(1)
})
这会创建一个observable,并且在请求订阅时会执行您传递给create
的函数。
.share()
这与上游订阅共享。这意味着第一个订阅者使share
创建对源的订阅,并且所有后续订阅者共享(原文如此!)此订阅。如果所有订户都取消订阅,则也会取消对源的订阅。请注意,在流之前完成流时,也会创建新的订阅。
c.subscribe(()=>console.log('first subscribe'))
第一个订阅者订阅,share
运营商创建共享订阅。因此,执行订阅功能并发出一个值。
c.subscribe(()=>console.log('second subscribe'))
第二个订阅者订阅,share
运营商重新使用已存在的订阅源。因此,订阅功能不执行,并且不会发出任何值。
如果将.unsubscribe()
添加到第一个subscribe
,那么它将按预期工作,因为共享订阅被取消而第二个订阅者导致另一个订阅功能的执行。