gpt4 book ai didi

rxjs - shareReplay 与 ReplaySubject - 只有 ReplaySubject 在订阅前缓存最新值

转载 作者:行者123 更新时间:2023-12-05 03:03:25 32 4
gpt4 key购买 nike

我有一个外部热源在观察者可以订阅之前推送值。订阅后,迟到的观察者应该收到最新的值以及从那时起的每个值。为此,我使用了以下代码(相关行标有“<<<”,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 几乎等同于第二种方式,实际上是通过这种方式实现的。我错过了什么?

最佳答案

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

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

关于rxjs - shareReplay 与 ReplaySubject - 只有 ReplaySubject 在订阅前缓存最新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54045981/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com