首页 > 解决方案 > 为什么第一次订阅热可观察对象后订阅不触发

问题描述

在我的代码中,我使用 share() 创建了一个 hot 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

标签: javascriptrxjs

解决方案


让我们一步一步地看这个例子。

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

create这会创建一个 observable,并在请求订阅时执行您传递给的函数。

.share()

这共享上游订阅。这意味着第一个订阅者share创建对源的订阅,并且所有后续订阅者共享(原文如此!)此订阅。如果所有订阅者都取消他们的订阅,那么对源的订阅也会被取消。请注意,当流之前完成时,也会创建一个新订阅。

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

第一个订阅者订阅,share运营商创建一个共享订阅。因此订阅函数被执行并发出一个值。

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

第二个订阅者订阅并且share运营商重新使用已经存在的订阅源。因此订阅函数不会被执行,也不会发出任何值。

如果您添加.unsubscribe()到第一个subscribe,那么它将按预期工作,因为共享订阅被取消并且第二个订阅者导致订阅功能的另一个执行。


推荐阅读