Самый простой способ сделать это - использовать shareReplay(1)
, это автоматически поместит ваш ответ в ReplaySubject
под капотом, и все подписывающиеся компоненты получат значение от субъекта воспроизведения вместо выполнения вызова API. Таким образом, ваш сервис может делать следующее:
getUserSettings(): Observable<UserSettings> {
var userSettUrl = this.baseUrl + this.ngAuth.getApiUrl('settings');
let httpHeader = {
headers: new HttpHeaders({
'Content-Type': 'application/x-www-form-urlencoded'
})
};
return this.http.get(userSettUrl, httpHeader).pipe(
map((res: any) => obj.settings),
shareReplay(1)
);
}
Тогда в ваших компонентах вы можете просто подписаться на это и получить свои результаты, либо подписавшись напрямую, либо используя async
pipe. При прямой подписке обязательно отмените подписку и выполните обнаружение изменений, если вы используете стратегию OnPush
, которую я рекомендую.
Конечно, другие альтернативы также могут работать. Например, было упомянуто ngrx, это может быть хорошим подходом для обмена данными в масштабе приложения, но для его объединения требуется гораздо больше усилий.