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 (). Как мне отказаться от подписки на условие, которое еще активно для данного компонента.

Спасибо.


person patz    schedule 29.08.2018    source источник
comment
где вы выполняете функциональный вызов stopPolling ()?   -  person Anjil Dhamala    schedule 29.08.2018
comment
это просто пример, его можно вызывать где угодно, как событие щелчка.   -  person patz    schedule 29.08.2018
comment
Спросил, потому что не увидел функционального вызова, на который отписывается подписка.   -  person Anjil Dhamala    schedule 30.08.2018
comment
@patz ты уверен, что условие верно? с кодом все в порядке, отписаться надо без проблем   -  person ggradnig    schedule 30.08.2018
comment
Вы можете подтвердить, что this.pollingSubscription.unsubscribe вызывается в stopPolling? Например, поместив console.log сразу после этой строки.   -  person ConnorsFan    schedule 30.08.2018
comment
Я понимаю, что он срабатывает, и строка отказа от подписки выполняется, но не вступает в силу.   -  person patz    schedule 30.08.2018
comment
может быть, компонент создается несколько раз?   -  person ggradnig    schedule 30.08.2018
comment
@ggradnig, если бы это было так, то поведение ngOnDestroy не было бы таким же. что не так.   -  person patz    schedule 30.08.2018
comment
Я не уверен, что изменилось в вашем коде, но я реконструировал его на StackBlitz и не нашел никаких проблем: stackblitz.com/edit/   -  person ggradnig    schedule 30.08.2018
comment
@ggradnig спасибо за это, похоже, там все работает как положено.   -  person patz    schedule 30.08.2018
comment
И startPolling не вызывается несколько раз откуда-то еще?   -  person ConnorsFan    schedule 30.08.2018
comment
@ConnorsFan только в ngOnInit ()   -  person patz    schedule 30.08.2018


Ответы (1)


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

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

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