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
中有三个单独的主题订阅。