javascript - 为什么第一次订阅热可观察对象后订阅不触发
问题描述
在我的代码中,我使用 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()
解决方案
让我们一步一步地看这个例子。
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
,那么它将按预期工作,因为共享订阅被取消并且第二个订阅者导致订阅功能的另一个执行。
推荐阅读
- sed - 如何递归创建文件夹
- django - `NOT NULL 约束失败:` 尝试创建用户时
- android - 在设备处于睡眠状态时对手机进行敲门操作?
- mysql - 远程 MySql 数据库 CPanel
- java - 程序类型已存在:com.google.common.annotations.GwtCompatible
- python - 移动numpy数组的列和行?
- c# - 如何检查绘制事件中写入的行是否超过破折号值。如果它超过破折号值,则将其标记为正确
- node.js - 我可以指示 nightmare.js 去我在本地主机上的快速路线吗?
- python - 索引 Keras 张量
- mysql - mysql 当 UNION 显示 [Err] 1111 - 组函数使用无效