我有以下代码:
const source = interval(1000).pipe(
take(3),
finalize(() => console.log('complete')),
shareReplay({ bufferSize: 1, refCount: true}),
);
source.subscribe(x => console.log(x));
source.subscribe(x => console.log(x));
source.subscribe(x => console.log(x));
现在,完整的日志调用一次。当我将finalize
运算符移动到shareReplay
之后时,它调用了3次,我猜这是每个订阅者,但是为什么这样工作?
const source = interval(1000).pipe(
take(3),
shareReplay({ bufferSize: 1, refCount: true}),
finalize(() => console.log('complete')),
);
finalize
运算符订阅了一次完成的内部ReplaySubject
,不是吗?
答案 0 :(得分:0)
最终化运算符在可观察到的源完成时发出。
ShareReplay 运算符为每个订阅者创建一个 new 可观察值,并重播原始可观察值。
Take 运算符仅在完成发射指定数量的采集时间后才完成。
因此,在您的第一种情况下, Take(3)可观察对象将发出3次,然后它的可观察对象完成并被终结一次。
在第二种情况下, ReplayShare 将为每个订户(在所有3个订阅中)创建一个 new 可观察到的事物,并最终确定被调用3次,每创建一个可观察的事物一次。