Когда вы подписываетесь на наблюдаемую из службы http, http-запрос запускается, как только запрос завершен, наблюдаемая завершается. Если будет сделана другая подписка, тогда снова сработает другой запрос.
Вам необходимо кэшировать результат запроса, если вы не хотите, чтобы другой запрос снова попадал на сервер.
Я написал библиотеку с именем ngx-rxcache, и это одна из ее основных целей.
https://medium.com/@adrianbrand/angular-state-management-with-rxcache-468a865fc3fb
Установить библиотеку с помощью «npm install ngx-rxcache»
Затем вы можете создать справочную службу данных
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { RxCacheService } from 'ngx-rxcache';
@Injectable({
providedIn: 'root'
})
export class RefDataService {
private titlesCache = this.cache.get<any[]>({
id: '[RefData] titles',
construct: () => this.http.get<any[]>('titles'),
autoload: true
});
constructor(
private http: HttpClient,
private cache: RxCacheService
) { }
get titles$(): Observable<any[]> {
return this.titlesCache.value$;
}
}
Это создаст сервис с заголовками $ observable, при первой подписке на него будет запущен http-запрос, и каждый раз после этого он будет получать его из кэша.
Функция конструктора должна возвращать наблюдаемую информацию о типе кэша, в этом случае вызов заголовков http получает конечную точку. Свойство autoload указывает кэшу вызывать функцию конструктора при первом обращении к значению.