Мое первое предложение - немного упростить код в этих строках
getApplication(): Observable<Array<Application>> {
if (this.app && this.app.length > 0) {
return Observable.of(this.app);
}
return this._http
.get<Application[]>(this.url)
.map((app) => this.mapToApp(app))
.do((result: Array<Application>) => {
this.app = result;
}
}
С помощью этой логики вы можете кэшировать, используя любую логику, какую захотите. Вы решили проверить, не является ли this.app
ненулевым и имеет ли оно некоторые элементы. Но вы можете использовать любую другую логику, возможно, в зависимости от входных параметров.
Другая история - это проблема двух вызовов одновременно. В этом случае вы, вероятно, захотите как share
Observable, чтобы была использована только одна подписка, так и replay
последний зарегистрированный результат, чтобы вы могли вернуть кэшированное значение.
Один из способов сделать это может быть следующим
private cache$: Observable<Array<Application>>;
requestApplication(): Observable<Array<Application>> {
return this._http
.get<Application[]>(this.url)
.map((app) => this.mapToApp(app))
.do((result: Array<Application>) => {
this.app = result;
}
}
getApplication() {
if(!cache$) {
cache$ = this.requestApplication().shareReplay(1);
}
return cache$;
}
Трюк здесь выполняется оператором shareReplay
. Часть share обеспечивает совместное использование подписки. Часть replay с размером буфера 1 гарантирует, что последний сохраненный результат всегда будет возвращен.
Тогда вы можете время от времени сталкиваться с проблемой очистки кэша. Но здесь история усложняется, и я предлагаю вам взглянуть на эту очень хорошую статью https://blog.thoughtram.io/angular/2018/03/05/advanced-caching-with-rxjs.html