Это относится к вашей архитектуре в целом.
Если это в значительной степени единственный случай, который вас раздражает, я бы рекомендовал использовать shareReplay
, чтобы вы могли поделиться результатами наблюдаемого со всеми потребители.
Пример:
@Injectable()
export class SomeService {
// ...
public users$: Observable<User[]> = this.http.get('xyz.com/api/users').pipe(
catchError(err => {
this.msgService.add({
severity: 'error',
summary: 'Internal Server Error',
detail: 'There is an Server Error occurred. Please try again later.',
});
throw err;
}),
shareReplay({
bufferSize: 1,
// usually `refCount` should be true so that when all the subscribers
// are not listening anymore, it'll close the observable but here let
// imagine that all your components are not listening to that and then
// later on you come back to it, it will return the previously fetched
// data without fetching it again. If **in that special case** you'd
// prefer to make another request turn that to true
refCount: false,
})
);
// ...
}
Таким образом, если у вас нет метода, одна и та же ссылка будет передана и использована. Благодаря shareReplay
вы не сделаете еще один запрос, если все не откажутся от подписки, а позже кто-то другой подпишется на него. Но пока есть 1 подписчик, не имеет значения, сколько присоединится после, результат будет поделён.
Вы также можете рассмотреть поиск в этой библиотеке: https://github.com/ngneat/cashew, которая упростит вашу жизнь и даст вам больше контроля.
Другой вариант - начать изучать ngrx, так как было бы целесообразно получить данные один раз в зависимости от того, где вы находитесь на маршрутах (получить один раз) затем поместите его в локальное «хранилище», и все компоненты получат доступ к этому хранилищу. Но это потребует от вас изучения приставок / ngrx и не будет простым. Если ваше приложение продолжает расти, я бы рекомендовал проверить его, поскольку оно действительно полезно, но это решение остается за вами, и вы можете go с тем, что вам наиболее удобно.