Мне кажется, я понимаю вашу проблему.
http.get (url) является наблюдаемым одноразового использования. Это не поток, который может быть запущен несколько раз, как субъекты. Вам нужно будет создать свою собственную тему и использовать ее в качестве прокси.
export class ClientService {
constructor(private http: HttpClient) {
}
private eventPublisher: Subject<Event[]> = new Subject<Event[]>();
receiveEvent(eventId){
// call http client here, and publish results to event publisher
const eventUrl = eventId;
this.http.get<Event[]>(eventUrl).subscribe(response => {
this.eventPublisher.next(response);
});
}
renderEvent(eventUrl): Observable<Event[]>{
// do not subscribe to http client here, subscribe to event publisher
return this.eventPublisher.asObservable();
}
Это шаблон проектирования pub-sub (издатель - подписчик). Возможно, было бы полезно ознакомиться с другими решениями этого шаблона проектирования, используя Angular, поскольку это довольно тривиальный пример.
Редактировать:
Вы также можете отказаться от подписки в своем компоненте как только вы закончите с подпиской, чтобы избежать утечек памяти.
Примерно так выглядит простой шаблон:
export class MyComponent implements OnInit, OnDestroy() {
constructor(private myService: MyService) { }
private destroyed: Subject<void> = new Subject<void>();
ngOnInit(): void {
this.myService.myMethod().pipe(
takeUntil(() => this.destroyed)
).subscribe(() => {
// do stuff
});
}
ngOnDestroy(): void {
this.destroyed.next(undefined);
this.destroyed.complete();
}
}
Хотя он становится повторяющимся, если вам нужно начать это делать много. Я лично использую этот метод: { ссылка }