Субъект RxJS получает несколько значений при подписке

#angular #rxjs #subject-observer

#angular #rxjs #субъект-наблюдатель

Вопрос:

У меня в моем сервисе Angular есть тема, подобная этой:

 private sub = new Subject();


sendSub(page: page) {
    this.sub.next(page);
}

getSub(): Observable<any> {
    return this.sub.asObservable();
}
  

В моем родительском компоненте я подписался getSub() . Из моего дочернего компонента я отправляю одно следующее значение, но в родительском я получаю два значения в подписке.

Нужно только одно значение, чтобы мой блок кода выполнялся только один раз:

 subscription: Subscription;

this.subscription = this.pageService
    .getSub()
    .subscribe(
        (data) => {
            this.data = data;
            this.nextSelection();
        }
    );
  

Комментарии:

1. Куда вы звоните this.pageService.getSub().subscribe() ? Предоставьте некоторый контекст.

2. @fridoo Вызов находится в блоке родительского конструктора

3. Ваш родительский компонент может быть создан дважды. Поместите a console.log в конструктор, чтобы проверить, выполняется ли он дважды.

4. getSub() вызывается в приложении только один раз, и это единственный экземпляр, который использует данные субъекта. @fridoo

5. Что ж, если обратный вызов subscribe next выполняется дважды, для этого могут быть две причины. Либо вы подписываетесь один раз, и тема отправляется дважды, либо вы подписываетесь дважды, и тема отправляется один раз. Вы когда-нибудь отказывались от подписки?

Ответ №1:

Изменить

 getSub(): Observable<any> {
  return this.sub.asObservable();
} 
  

Для

 getSub: Observable<any> = this.sub.asObservable();
  

Это гарантирует, что каждый подписчик использует одну и ту же тему.

Комментарии:

1. Спасибо. Я попробовал этот подход, и результат тот же. просто информация в приведенных выше комментариях У меня есть только один потребитель, но настройка значения выполняется из нескольких мест, но только один в любой точке

Ответ №2:

Добавьте код подписки в конструктор родительского компонента.Вот такая же скрипка

 this.appService
    .getSub()
    .subscribe(
        (data) => {
             this.data = data;
             this.nextSelection();
        }
    );
  

Комментарии:

1. спасибо за ответ. В моем коде не так много различий, и предлагается, поскольку подписка в моем коде позволяет мне легко отказаться от подписки на вызовы.