在观察者可以订阅之前,我有一个外部热源在推送数值。订阅后,较晚的观察者应收到最新的值以及此后的每一个值。为此,我使用了以下代码(相关代码行标记为‘<’,这里的s Subject只是为了能够创建最简单的示例,实际上热源的工作方式不同):
// 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,但什么也没发生),但我找到了一种方法让它起作用:
// 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相当于第二种方式,实际上是以这种方式实现的。我遗漏了什么?
发布于 2019-01-07 17:52:15
当您使用s.pipe(shareReplay(1))时,您只是向链中添加了一个操作符(就像更改链的原型一样)。但是没有订阅,当shareReplay本身没有任何观察者时,它也不订阅它的源代码。所以它没有缓存任何东西,因为即使在source是“热门”的时候,也没有对source Observable的订阅。
但是,当您使用s.subscribe(r)时,您会定期订阅s,因此r开始接收项目,而ReplaySubject将缓存这些项目。
https://stackoverflow.com/questions/54045981
复制相似问题