Angular отписаться не получается без ngOnDestroy

Невозможно отказаться от подписки на подписку, если она используется в общедоступном методе, а не в ngOnDestroy.

Если есть наблюдаемый интервал rxjs, который используется для опроса API. onNgInit Я подписываюсь на наблюдаемое следующим образом:

Class .. {
   pollingSubscription: Subscription;

  ngOnInit() {
      startPolling();
  } 

  // when this gets triggered my polling subscription stops
  ngOnDestroy() {
      if (this.pollingSubscribe) {
          this.pollingSubscription.unsubscribe();
      }
  }

   startPolling() {
      const pollingInterval: Observable<any> = observable.interval(3000).startWith(0);
      this.pollingSubscription = pollingInterval.subscribe( _ => {
         this.store.dispatch(// trigger my Action);
      });
   }

   // when this gets triggered on a click event my polling subscription still keeps polling.
   stopPolling() {
       if ( // condition true) {
           // on this condition stop polling, FYI this line does get triggered,
           // but there is no effect, it still keeps subscribed.
           this.pollingSubscription.unsubscribe();
       }
   }
}

Что-то не так, что я делаю в публичной функции stopPolling (). Как мне отказаться от подписки на условие, которое еще активно для данного компонента.

Спасибо.

где вы выполняете функциональный вызов stopPolling ()?

Anjil Dhamala 29.08.2018 22:56

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

patz 29.08.2018 22:58

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

Anjil Dhamala 29.08.2018 23:01

@patz ты уверен, что условие верно? с кодом все в порядке, отписаться надо без проблем

ggradnig 29.08.2018 23:02

Вы можете подтвердить, что this.pollingSubscription.unsubscribe вызывается в stopPolling? Например, поместив console.info сразу после этой строки.

ConnorsFan 29.08.2018 23:02

Я понимаю, что он срабатывает, и строка отказа от подписки выполняется, но не вступает в силу.

patz 29.08.2018 23:03

может быть, компонент создается несколько раз?

ggradnig 29.08.2018 23:04

@ggradnig, если бы это было так, то поведение ngOnDestroy не было бы таким же. что не так.

patz 29.08.2018 23:05

Я не уверен, что изменилось в вашем коде, но я реконструировал его на StackBlitz и не нашел никаких проблем: stackblitz.com/edit/…

ggradnig 29.08.2018 23:10

@ggradnig спасибо за это, похоже, там все работает как положено.

patz 29.08.2018 23:13

А startPolling не вызывается несколько раз, откуда-то еще?

ConnorsFan 29.08.2018 23:29

@ConnorsFan только в ngOnInit ()

patz 29.08.2018 23:54
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
12
1 043
1

Ответы 1

Ваш class использует implements OnInit, OnDestroy ?? может быть, если ваш класс не реализован с использованием OnDestroy, тогда ngOnDestroy() не будет выполняться. Это официальная ссылка для OnDestroy

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

@Component({selector: 'my-cmp', template: `...`})
class MyComponent implements OnDestroy {
    ngOnDestroy() {
       // ...
    }
}

Другие вопросы по теме