У меня есть HTTP-запрос, который я хочу поделиться результатами для нескольких компонентов. HTTP-запрос, конечно, возвращает Observable
. Я хочу, чтобы на несколько компонентов можно было подписаться без дополнительных HTTP-запросов.
Я выполнил это с помощью Subject
в компоненте, который сделал HTTP-запрос по требованию и у которого есть другой способ подписки на тему.
Хотя это работает - это кажется излишним, и, безусловно, есть лучший способ сделать это.
предметная служба
@Injectable()
export class EventService {
subject: BehaviorSubject<any> = new BehaviorSubject<any>(Observable.create());
constructor(private api: Api) {}
fetch = () => {
this.subject.next(
this.api.getUsers().pipe(share())
);
};
listen = (): Observable<any> => {
return this.subject.asObservable();
};
}
и один подписчик
@Injectable
export class EventListenerA {
constructor(private eventService: EventService){
eventService.fetch(); // make initial call
eventService.listen().subscribe(o => {
o.subscribe(httpResponse => {
//do something with response
})
});
}
}
и второй абонент
@Injectable
export class EventListenerB {
constructor(private eventService: EventService){
eventService.listen().subscribe(o => {
o.subscribe(httpResponse => {
//do something else with response
})
});
}
}
Когда я удаляю share()
из цепочки каналов, выполняется несколько сетевых запросов. Есть ли более элегантный / правильный способ передачи наблюдаемого в next
из Subject
? Или другой шаблон в целом