Невозможно отказаться от подписки на подписку, если она используется в общедоступном методе, а не в 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 (). Как мне отказаться от подписки на условие, которое еще активно для данного компонента.
Спасибо.
это просто пример, его можно вызывать где угодно, как событие щелчка.
Спросил, потому что не увидел функционального вызова, на который отписывается подписка.
@patz ты уверен, что условие верно? с кодом все в порядке, отписаться надо без проблем
Вы можете подтвердить, что this.pollingSubscription.unsubscribe вызывается в stopPolling? Например, поместив console.info сразу после этой строки.
Я понимаю, что он срабатывает, и строка отказа от подписки выполняется, но не вступает в силу.
может быть, компонент создается несколько раз?
@ggradnig, если бы это было так, то поведение ngOnDestroy не было бы таким же. что не так.
Я не уверен, что изменилось в вашем коде, но я реконструировал его на StackBlitz и не нашел никаких проблем: stackblitz.com/edit/…
@ggradnig спасибо за это, похоже, там все работает как положено.
А startPolling не вызывается несколько раз, откуда-то еще?
@ConnorsFan только в ngOnInit ()





Ваш class использует implements OnInit, OnDestroy ?? может быть, если ваш класс не реализован с использованием OnDestroy, тогда ngOnDestroy() не будет выполняться. Это официальная ссылка для OnDestroy
В следующем фрагменте показано, как компонент может реализовать этот интерфейс для определения своего собственного метода очистки.
@Component({selector: 'my-cmp', template: `...`})
class MyComponent implements OnDestroy {
ngOnDestroy() {
// ...
}
}
где вы выполняете функциональный вызов stopPolling ()?