Subject.pipe(last())与ReplaySubject(1)?

时间:2018-09-12 16:25:59

标签: javascript typescript rxjs

从观察者的角度来看,将Subjectlast()一起使用是否与ReplaySubject(1)相同?

在这种情况下:

let s1 = new Subject<any>().pipe(last());
let s2 = new ReplaySubject<any>(1)();

因此,在这种情况下,如果s1s2的序列源相同,那么s1s2的订户将看到相同的值序列?

2 个答案:

答案 0 :(得分:2)

不,他们不会做同样的事情。

last的目的是阻止可观察对象发出任何东西,直到该可观察对象完成为止,这时它立即发出最后一个值。任何想要查看最后一个值的人都必须先订阅它。

ReplaySubject的目的是能够较晚订阅。借助ReplaySubject(1),如果某人在观察对象已经发出一段时间后订阅了该可观察对象,他们将立即重播发出的最后1个事物。

示例1:

let subject = new Subject();
let s1 = subject.pipe(last());
s1.subscribe(val => console.log('first subscription', val));
subject.next(1);
subject.next(2);
subject.next(3);
subject.complete();
s1.subscribe(val => console.log('second subscription', val));

在上面的示例中,您将看到它注销了“首次订阅3”,并且没有其他内容。

示例2:

let s2 = new ReplaySubject(1);
s2.subscribe(val => console.log('first subscription', val));
s2.next(1);
s2.next(2);
s2.next(3);
s2.complete();
s2.subscribe(val => console.log('second subscription', val));

在示例2中,您将看到它注销了“第一订阅1”,“第一订阅2”,“第一订阅3”,“第二订阅3”

答案 1 :(得分:1)

补充一下这个答案:有时你会遇到 replaySubjects 的问题:当你在它上面做一个管道时,它会返回一个 Observable 而不是 ReplaySubject。

因此,要让您的 observable 始终返回最后一个值,您可以使用 shareReplay 运算符。

ReplaySubjects 和 shareReplay 的用例是通知延迟订阅的订阅者之前的值。 Last() 不提供这个

let subject = new Subject();
let s1 = subject.pipe(shareReplay(1));
相关问题