为什么订阅在首次订阅热观察后没有触发

时间:2018-06-07 07:06:44

标签: javascript rxjs

在我的代码中我使用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()

jsfiddle

1 个答案:

答案 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,那么它将按预期工作,因为共享订阅被取消而第二个订阅者导致另一个订阅功能的执行。