首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >shareReplay与ReplaySubject -仅ReplaySubject在订阅前缓存最新值

shareReplay与ReplaySubject -仅ReplaySubject在订阅前缓存最新值
EN

Stack Overflow用户
提问于 2019-01-05 04:59:45
回答 1查看 1.3K关注 0票数 2

在观察者可以订阅之前,我有一个外部热源在推送数值。订阅后,较晚的观察者应收到最新的值以及此后的每一个值。为此,我使用了以下代码(相关代码行标记为‘<’,这里的s Subject只是为了能够创建最简单的示例,实际上热源的工作方式不同):

代码语言:javascript
复制
// irrelevant, just to send values
const s = new Subject();

// make the observable cache the last value
const o = s.pipe(shareReplay(1)); // <<<

// now, before subscription, values start coming in
s.next(1);
s.next(2);
s.next(3);

o.subscribe(n => console.warn('!!!', n));

这不起作用(我希望它能打印!!! 3,但什么也没发生),但我找到了一种方法让它起作用:

代码语言:javascript
复制
// irrelevant, just to send values
const s = new Subject();

const r = new ReplaySubject(1);
s.subscribe(r);
const o = r.asObservable();

s.next(1);
s.next(2);
s.next(3);

o.subscribe(n => console.warn('!!!', n));

也就是说,我没有使用shareReplay(1),而是创建了一个ReplaySubject(1)并将其用作桥梁。有了这段代码,我就得到了梦寐以求的!!! 3

虽然我很高兴它可以工作,但我想知道为什么第一个代码片段不能工作,我一直认为shareReplay相当于第二种方式,实际上是以这种方式实现的。我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-07 17:52:15

当您使用s.pipe(shareReplay(1))时,您只是向链中添加了一个操作符(就像更改链的原型一样)。但是没有订阅,当shareReplay本身没有任何观察者时,它也不订阅它的源代码。所以它没有缓存任何东西,因为即使在source是“热门”的时候,也没有对source Observable的订阅。

但是,当您使用s.subscribe(r)时,您会定期订阅s,因此r开始接收项目,而ReplaySubject将缓存这些项目。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54045981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档