RxJS. Простой кэш HTTP запроса с параметром

Кэш через 2 pipe оператора

  • publishReplay(1) - буфер в одно сообщение. Каждый новый подписчик получит последний результат.
  • refCount() - автоматически вызывет методы connect(), если появляются подписчки и unsubscribe(), когда подписчиков не остаётся.
/** cached data */
private _cache: Observable<WhateverResponse>;

...

getData(): Observable<WhateverResponse> {
    if (!this._cache) {
        this._cache = this._http.get('url').pipe(
            publishReplay(1),
            refCount()
        );
    }
    return this._cache;
}  

Для хранения кэша отдельных запросов предлагается использовать Map с ключами, которые являются параметрами запросов. Если используется объект параметров, то лучше его сериализовать в строку, из-за того, что объекты сравниваются по ссылке. Пример

{ a: '1'} == { a: '1' } // вернёт false
JSON.stringify({ a: '1'}) === JSON.stringify({ a: '1' } ) // вернёт true

Пример реализации:

/** http cache map */
private _instanceCache = new Map<string, Observable<TProductInstanceListResponse>>();

...

/**
 * Product instance list
 */
getInstanceList(params: EntityListParams = {}): Observable<TProductInstanceListResponse> {
    const key = JSON.stringify(params);
    if (!this._instanceCache.has(key)) {
      const response = this._http.get('instance', params).pipe(
        publishReplay(1),
        refCount()
      );
      this._instanceCache.set(key, response);
    }
    return this._instanceCache.get(key);
}

Для более сложных случаев рекомендуется библиотека cashew


Похожие записи

Как добавить ng-bootstrap компоненты в проект Angular-CLI?

Покажу на примере нового проекта.

ng new project_name
cd project_name
npm install --save bootstrap@next
npm install --save @ng-bootstrap/ng-bootstrap

В angular-cli.json в секцию style надо добавить наш CSS, чтобы глобально подключить стили.

  "styles": [
    "styles.css",
    "../node_modules/bootstrap/dist/css/bootstrap.min.css"
  ],
17 августа 2017 г. в Angular

Angular. Can't set breakpoints in VS Code

Вариант решения проблемы, когда не срабатывают точки остановки при разработке Angular приложений в редакторе VS Code
10 апреля 2018 г. в Angular

Angular attribute setter

Пример задания значения булева Input свойства как директивы, на примере:

09 октября 2018 г. в Angular