Я не могу остановить setInterval () после выполнения условий if даже после использования clearInterval - PullRequest
0 голосов
/ 22 апреля 2020

У меня проблемы с запуском функции setInterval. Я хочу, чтобы эта функция setInterval остановилась после выполнения условия if. Для этого я поставил стопор в качестве идентификатора для setInterval и поместил clearInterval для завершения setInterval. Уверяю вас, this.statusFun c работает хорошо. Все, что я хочу, - это после того, как this.statusFun c преобразуется в 1, что означает, что setInterval () заканчивается.

    statusFunc = 0;

    ngOnInit() {

    var stopper = setInterval(function(){
    if (this.statusFunc == 1) {
        console.log(this.statusFunc);
        this.afterFirstSignal();
        clearInterval(stopper);
    }
  }, 2000);
 }

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Значение this не будет таким, каким, как вы думаете, должно быть при вызове функции-обработчика setInterval (), поэтому this.statusFunc, скорее всего, будет undefined. Чтобы использовать значение this, соответствующее вашему компоненту (я полагаю, это то, что вам нужно), у вас есть несколько опций, самым чистым из которых, вероятно, является использование оператора стрелки:

var stopper = setInterval(() => {
    if (this.statusFunc == 1) {
        console.log(this.statusFunc);
        this.afterFirstSignal();
        clearInterval(stopper);
    }
}, 2000);

Оператор жирной стрелки сохранит контекст this.

0 голосов
/ 22 апреля 2020

Вы можете получить желаемую функциональность потенциально более читабельным способом, с помощью

ngOnInit() {
    this.timer = timer(0, 1000).pipe(
        skipWhile(() => this.statusFunc !== 1)
    ).subscribe(() => {
        console.log(this.statusFunc);
        this.afterFirstSignal();
    });
}

ngOnDestroy() {
    this.timer.unsubscribe();
}

Или вместо этого вы можете использовать Rx JS BehaviorSubject , что можно сделать без таймер на всех. Вместо this.statusFunc = 1 вы могли бы сделать this.status.next(1)

statusSubject = new BehaviorSubject(0);

ngOnInit() {
    this.subscription = this.statusSubject.pipe(
        filter(status => status === 1)
    ).subscribe(() => {
        this.afterFirstSignal();
    );
}

ngOnDestroy() {
    this.subscription.unsubscribe();
}
...