我了解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>