rxjs: кеширование разных http-запросов - PullRequest
0 голосов
/ 04 февраля 2019

Этот вопрос был перемещен в Code-Review:

https://codereview.stackexchange.com/questions/212854/rxjs-caching-different-http-requests


Было несколько обсуждений о кэшировании http-запросов с помощью rxjs,в этом вопросе / предложении я хочу предложить пользовательский rxjs-оператор (не чистый) для обеспечения кэширования:

const cacheHttp = (cacheKey: string, cacheStorage: any) => (source: Observable<any>) => {
  if (!cacheStorage[cacheKey]) {
    cacheStorage[cacheKey] = source.pipe(
      shareReplay(1)
    );
  }
  return cacheStorage[cacheKey];
};

Этот оператор не является чистым, поскольку он изменяет один из своих аргументов (cacheStorage).

Этот оператор можно использовать следующим образом:

public cachedItems = {};

public getDataForItem$(itemId: string) {
    return this.http.get('/item/' + itemId).pipe(
        cacheHttp(itemId, this.cachedItems),
        shareReplay(1)
    );
}

Клиент может затем несколько раз вызвать его, не вызывая лишних http-запросов:

// the following two subscriptions cause http-requests
this.itemService.getDataForItem('firstItem').subscribe((val) => console.log(val));
this.itemService.getDataForItem('secondItem').subscribe((val) => console.log(val));

// all further subscriptions would not cause any additional http-requests
this.itemService.getDataForItem('firstItem').subscribe((val) => console.log(val));
this.itemService.getDataForItem('secondItem').subscribe((val) => console.log(val));
this.itemService.getDataForItem('firstItem').subscribe((val) => console.log(val));
this.itemService.getDataForItem('secondItem').subscribe((val) => console.log(val));

// this subscription would again cause an http-request:
this.itemService.getDataForItem('thirdItem').subscribe((val) => console.log(val));

Сейчасмои вопросы: Является ли это приемлемым подходом к решению проблемы «кеш для разных запросов»?Возможно, есть утечка памяти или есть утечка подписок?Можно ли иметь побочные эффекты для указанного аргумента?

Любые комментарии или советы по поводу проблем с этим пользовательским оператором приветствуются!

...