RxJS Observable - прикрепить тему потребителя при подписке - PullRequest
0 голосов
/ 07 марта 2019

У меня есть служба Angular, которая хранит приватный BehaviorSubject, чтобы он мог прочитать значение в любой момент времени.Он является частным, поэтому любой компонент, который его использует, не может им манипулировать.Вместо этого обычный Observable выставляется как публичный.BehaviorSubject теперь является потребителем любых данных, излучаемых этой наблюдаемой.

public subheaderData$: Observable<SubheaderData>;
private subheaderDataSubject$: BehaviorSubject<SubheaderData> = new BehaviorSubject<SubheaderData>(null);

constructor(private repository: SubHeaderRepository) {
    this.subheaderData$ = this.load();
    this.subheaderData$.subscribe(this.subheaderDataSubject$);
}

Как вы можете видеть, я звоню .subscribe из своего сервиса, что сразу делает мою наблюдаемую горячую.Я хотел бы, чтобы компонент, который внедряет этот сервис, подписывался на общедоступную Observable, и когда это происходит, BehaviorSubject должен автоматически добавляться в качестве наблюдателя, даже если компонент не знает об этом (из-за того, что это личное.

Как это можно сделать?

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Если я не упускаю ничего критического, думаю, вы сможете выполнить то, что хотите, только с помощью multicast, хотя это будет немного необычный вариант использования.

subheaderDataPublic$ = this.subheaderData$.pipe(
  multicast(this.subheaderDataSubject$, s => s),
);

Тогдав вашем компоненте вы будете подписываться на subheaderDataPublic$.

Как правило, вы будете использовать multicast, например, вот так:

multicast(new Subject(), s => merge(s, s.pipe(...)))

... но если вы передадите его this.subheaderDataSubject$ будет использоваться в качестве промежуточного предмета.Это s => s выше необходимо, потому что без функции выбора multicast возвращает экземпляр ConnectableObservable, который, вероятно, вам не нужен.

РЕДАКТИРОВАТЬ: Возможно, более понятное решение будет использовать просто Observable конструктор.

subheaderDataPublic$ = new Observable(observer => {
  const subscriptions = new Subscription();
  subscriptions.add(this.subheaderData$.subscribe(this.subheaderDataSubject$));
  subscriptions.add(this.subheaderDataSubject$.subscribe(observer));

  return () => subscriptions.unsubscribe();
});
1 голос
/ 07 марта 2019

Сделайте это в своем конструкторе сервисов

this.subheaderData$ = this.subheaderDataSubject$.asObservable();

, затем подпишитесь на subheaderData$ при необходимости

, и вы сможете this.subheaderDataSubject$.next(someValue) в вашем сервисе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...