ну если вкратце
спасибо! дочитал на rxjs. возник вопрос насколько уместно будет shareReplay применить сразу тут: get(): Observable<Book[]> { return this.httpClient.get<Book[]>(`${this.url}`); } думаю правильно - так как на источнике данных. но вот с точки зрения pure function - уже не очень
это ж метод для получения данных, а не для кэширования
да. это и смущает. как разделить?
кеширование в компоненте обычно делается
там shareReplay уже не работает.
Что значит там ?
компонент: this.books$ = this.bookService.get().pipe(shareReplay()); сервис: get(): Observable<Book[]> { return this.httpClient.get<Book[]>(`${this.url}`); }
Ну тут в любом случае не pure функция
этот вариант выполняет запрос каждый раз когда подписываюсь
Да, именно поэтому она не pure
потому что компонент уничтожается и заново вызывается подписка.
а надо чтобы взял с бека данные один раз и всегда отдавал с кеша?
в сервисе закешируйте
хотелось бы средствами rxjs . не очень хочется городить мапу -кеш
сделайте средствами rxjs
Зачем мапа? shareReplay используйте
export class CacheService { // На date$ подписываемся там, где нужны данные. public date$ = this.getCurrentDate(); // С помощью updateCache$ обновляем данные. // Есть нюанс, свежие обновления текущие подписчики на date$ не получат, // получат только новые подписчики. private updateCache$ = new Subject<boolean>(); constructor(private httpClient: HttpClient) {} private getCurrentDate(): Observable<Date> { return this.httpClient.get('assets/data.json').pipe( switchMap(() => of(new Date)), share({ connector: () => new ReplaySubject(1), resetOnComplete: () => this.updateCache$.asObservable() }) ) } public updateCache(): void { this.updateCache$.next(true) } }
Не очень хорошее решение, учитывая то, что старые подписчики не получат новые данные
Я бы сказал, что всё зависит от контекста задачи. Он определяет какое решение больше подходит. Я всего лишь предложил один из возможных вариантов.
А тут вообще работать то будет? Мне кажется тут запрос в принципе один раз уйдёт, нет?
Хм... На комплит потоке не должен.
я использую похожее, только упакованное в одну функцию, и с апдейта переключение через switchMap, так в запрос можно передать исходные данные
Обсуждают сегодня