Не используйте toPromise () и asyn c / await. Вместо этого всегда возвращайте Observable.
@Injectable({ providedIn: 'root' })
export class TestState {
private readonly _result$ = new ReplaySubject<number[]>(1);
get results(): Observable<number[]> {
return this._result$.asObservable();
}
updateResults(newResults: number[]): void {
this._result$.next(newResults);
}
getLatestResults(): Observable<number[]> {
return await this.results.pipe(take(1));
}
}
Не подписывайтесь на этом Фасаде, не реализуйте OnDestroy на этом Фасаде, вы должны выполнять такое поведение внутри компонента. У вас должна быть только одна наблюдаемая, и эти кэшированные данные будут перетекать в один поток, который вы печатаете в html через асин c канал.
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
name = 'Angular';
value: number;
result$: Observable<number[]>;
subject: Subject<void> = new Subject();
constructor(private readonly _test: TestFacade) {
this.result$ = this._test.pipe(takeUntil(this.subject)).getLatestResults();
}
ngOnInit() {}
ngOnDestroy() {
this.subject.next();
this.subject.complete();
}
}
Пожалуйста, предоставьте больше информации об этом кэшировании на примере из реальной жизни. , У меня никогда не было ситуации, когда мне понадобился бы ReplaySubject. Например, если вы хотите кэшировать http-запросы, для него есть операторы rx js (shareReplay). Если вы хотите кэшировать данные в состоянии, вы можете хранить некоторую информацию validUntil, которая скажет, что данные не нужно перезагружать до некоторой даты.