RxJS通过为每个订阅者调用shareReplay来终结运算符

时间:2019-04-05 12:47:09

标签: rxjs

我有以下代码:

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,不是吗?

1 个答案:

答案 0 :(得分:0)

最终化运算符在可观察到的源完成时发出。

ShareReplay 运算符为每个订阅者创建一个 new 可观察值,并重播原始可观察值。

Take 运算符仅在完成发射指定数量的采集时间后才完成。

因此,在您的第一种情况下, Take(3)可观察对象将发出3次,然后它的可观察对象完成并被终结一次。

在第二种情况下, ReplayShare 将为每个订户(在所有3个订阅中)创建一个 new 可观察到的事物,并最终确定被调用3次,每创建一个可观察的事物一次。