【问题标题】:How do I pause shareReplay when there are no subscribers没有订阅者时如何暂停 shareReplay
【发布时间】:2019-04-16 19:24:39
【问题描述】:

例如:

const s = rxjs.interval(2000).pipe(tap(console.log), shareReplay(1))
const b = s.subscribe(v => {})
// wait, console will begin output 0, 1, 2, 3, ...
b.unsubscribe()
// console will continue output 4, 5, 6, 7, ...

我希望在没有订阅者时暂停我的流以节省 CPU 使用率。

没有订阅者时如何暂停直播?

目标是让多个订阅者共享一个流。

  • 当第一个订阅者到来时,流将从一个初始值开始,并定期提供数据。
  • 当新订阅者到来时,它将获得流中的最新值。
  • 当所有订阅者都离开时,数据流可以安全关闭,下一个来的将被视为第一个。

【问题讨论】:

  • 你有什么 RxJS 版本?看起来 refCount 就是您要查找的内容。

标签: javascript rxjs observable


【解决方案1】:

您需要multicast 来通过ReplaySubject 共享您的数据,并使用refCount 来跟踪订阅者数量。

const s = rxjs.interval(2000).pipe(
  tap(console.log), 
  multicast(() => new ReplaySubject(1)),
  refCount()
);

const b = s.subscribe(v => {})

setTimeout(()=>{
  b.unsubscribe()
}, 5000)

【讨论】:

  • 完美运行。但是如果新订阅者由refCount处理,ReplaySubject如何在新订阅者到来时立即响应。
  • @ZangMingJie,正如你所说,ReplaySubject(1) 会将其最新的1 值推送给所有订阅者。而refCount 负责为每个“订阅会话”共享相同的ReplaySubject。简单地说,每次所有订阅者退订时,它都会重置为新的ReplaySubject
  • 您可以从 RxJS 核心成员文章中阅读更多关于多播的信息:medium.com/@cartant
  • @AlexanderPoshtaruk,如果你愿意推广一些东西——它至少应该涵盖特定的问题。链接“medium/cartant”与链接“github/rxjs”几乎相同。首先我们应该关心给出答案,推广应该是次要的。
猜你喜欢
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多