RxJS ShareReplay和PublishReplay

时间:2019-07-12 14:18:06

标签: angular rxjs6

我了解ShareReplay和PublishReplay之间的区别,但是在下面的示例中,我可以澄清一下为什么在上一个PublishReplay之后不久的PublishReplay不会发出任何事件,但是ShareReplay会发出任何事件。

我有一个Angular服务,它为一些组件提供一些API数据。我使用publishReplay将数据多播到组件,而无需多次重新获取数据,并且一旦所有组件取消订阅,便将其清除。

@Injectable()
export class APIService {

  data = this.http.get(url).pipe(
      publishReplay(1)
  );
}

一旦组件接收到数据事件,它们便会构建FormControl,并且仍然使用html中的原始数据,从而使用水龙头

@Component()
export class SomeComponent {

  data = this.apiService.data.pipe(
      tap((data) => buildControls(data))
  );
}

在少数情况下,我需要在构建完formControls之后创建一些可观察对象。我需要对此多播,否则formControls将在每个后续订阅上重建,并且绑定不正确。

@Component()
export class SomeComponent {

  data = this.apiService.data.pipe(
      tap((data) => buildControls(data)),
      shareReplay(1) // PublishReplay does not work here
  );

  someObservable = this.data.pipe(
    switchMap(() => buildLinkedControls())
  );
}

在上面的组件示例中,为什么PublishReplay不触发任何事件,而shareReplay触发。因为缓冲区将继续存在,在这里使用shareReplay是否有任何危险?

为完整起见,下面是html的简单示例

<ng-container *ngIf="(data | async)?.properties as props">
   <input *ngIf="props?.someInput" [formControl]="formGroup.get('someInput')">
    ...
   <div>{{ someObservable | async }}</div?
</ng-container>

0 个答案:

没有答案