shareReplay(config) 似乎没有共享订阅

shareReplay(config) does not seem to share subscription

假设此 Angular 代码:

import { Component } from '@angular/core';
import { shareReplay, tap, timer } from 'rxjs';

@Component({
  selector: 'my-app',
  template: '{{test$ | async}} {{test$ | async}}',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  test$ = timer(0, 1000).pipe(
    shareReplay({ bufferSize: 1, refCount: true }),
    tap(console.log)
  );
}

为什么 console.log 出现两次并且订阅显然没有共享? 据我所知,shareReplay 的配置参数重载是当前推荐的明确共享订阅的方式。我是不是弄错了什么?

rxjs 7.5.2, ng 13.2

因为您实际上在代码中订阅了两次

template: '{{test$ | async}} {{test$ | async}}'

如果您将 tap 移动到 shareReplay 上方,它应该出现一次

shareReplay通过创建中间主题完成分享。

因此, obs = source -> opratorA -> opB -> share(intermediate subjectC) -> opD -> opE

当你订阅obs时,你实际上订阅了subjectC,有opD和opE。
这样,opA和opB之后的stream是共享的,opD和opE的计算是不共享的。

const test$ = timer(0, 1000).pipe(
    map(v => v * 2), // shared
    tap(console.log), // shared
    shareReplay({ bufferSize: 1, refCount: true }),
    tap(console.log) // not shared
  );