Мне трудно найти решение для кэширования http-запроса в BehaviorSubject.Я хотел иметь только один метод обналичивания и получения стоимости.Пример ниже:
@Injectable({
providedIn: 'root'
})
export class DataStoreService {
private readonly initialState: DataState = {
data: string,
loaded: false
};
private data$: BehaviorSubject<DataState> = new BehaviorSubject<DataState>(this.initialState);
constructor(private dataService: DataService) { }
getData$(id: string): Observable<string> {
return this.data$.asObservable()
.pipe(
switchMap((state: DataState) => {
if (!state.loaded) {
this.dataService.getData$(id);
} else {
return of(state.data);
}
}),
withLatestFrom(this.data$.asObservable()),
map(([data, state]) => {
if (!state.loaded) {
this.data$.next({
loaded: true,
data
});
}
return data;
})
);
}
}
Я еще не тестировал его (сервис не работает), но пока выглядит нормально.Кто-нибудь знает какое-нибудь лучшее решение, чтобы в rxjs было меньше трубопроводов и условных выражений (если / еще) в rxjs для такого вида использования?