RxJS finalize运算符,为每个订阅者调用shareReplay

RxJS finalize运算符,为每个订阅者调用shareReplay,rxjs,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.subsc

我有以下代码:

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
之后时,它调用了三次,我猜是每个订阅者调用的,但为什么它会这样工作呢

   const source = interval(1000).pipe(
      take(3),
      shareReplay({ bufferSize: 1, refCount: true}),
      finalize(() => console.log('complete')),
    );

finalize
操作符订阅了内部
ReplaySubject
,该内部
ReplaySubject完成一次,没有?

finalize操作符在其源观测完成时发出

ShareReplay操作员为每个订户创建一个新的可观察值,并回放原始可观察值

Take运算符仅在完成后完成,以发出指定的Take次数

所以在第一种情况下,Take(3)observable将发出3次,然后它的observable就完成了,finalized被调用一次


在第二种情况下,ReplayShare将为每个订阅者创建一个新的可观察对象(在所有3个订阅中),并将为每个创建的可观察对象呼叫3次。对不起,我不完全理解您的解释。我正在打电话,稍后我会画一张画diagram@undefined我已经编辑了我的答案,希望它的定义更好。换句话说,把shareReplay放在定稿后。你已经正确回答了你的问题
shareReplay
只对其源代码进行一次订阅,因此只调用一次
finalize
。如果在
shareReplay
之后使用
finalize
,则在
shareReplay
中有三个单独的主题订阅。