Как остановить интервал?

#javascript #typescript #function #oop #methods

#javascript #typescript #функция #ооп #методы

Вопрос:

Я пытаюсь создать кнопку, которая остановит метод, выполняющий setInterval.

Для этого я использую clearInterval, но по какой-то причине он не позволяет мне настроить таргетинг на переменную setInterval.

 class Helpers {
    static start(value: Vehicle): void {
        let begin = setInterval(value.calculateSpeed, 1000, value);
    }
    static stop() {
        let stop = clearInterval(Helpers.begin);
    }
}
 

Вместо этого я также попробовал использовать пространство имен, но тоже ничего не вышло.

 namespace Extras {
    export function start(value:Vehicle) {
        let begin = setInterval(value.calculateSpeed, 1000, value);
    }
    export function stop() {
        let stop = clearInterval(Extras.begin);
    }
}
 

метод start() работает нормально … но метод stop() ничего не делает. Любая помощь была бы очень признательна.

Большое вам спасибо за вашу помощь, ребята! Вы решили мою проблему!

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

1. Helpers.begin это undefined потому begin , что это локальная переменная.

2. область действия let ограничена функцией, а не классом или экземпляром. Я бы ожидал чего-то подобного Helpers.begin = setInterval() , но затем написанного в синтаксисе typescript (если он отличается).

3. Зачем вам нужны эти фиктивные классы? Просто используйте setInterval там, где ему самое место в вашем коде.

Ответ №1:

Вам нужно, чтобы указанная переменная была статической. В настоящее время переменная begin является локальной для вашей start функции. Кроме того, вам не нужно сохранять ссылку на значение, возвращаемое clearInterval . Лучшим именем для begin было бы interval или intervalId

 class Helpers {
    static interval;
    static start(value: Vehicle): void {
        Helpers.interval = setInterval(value.calculateSpeed, 1000, value);
    }
    static stop() {
        clearInterval(Helpers.interval);
    }
}
 

Обновить:
Однако создание intervelId статики не является хорошей идеей, поскольку вы можете захотеть использовать этот вспомогательный класс более чем в одном месте одновременно. Если сделать его статическим, будет создана единственная копия переменной, что может привести к проблемам.

Лучшим подходом было бы что-то вроде этого:

 class Helpers {
    private _intervalId;
    start(value: Vehicle): void {
        this._intervalId = setInterval(value.calculateSpeed, 1000, value);
    }
    stop() {
        clearInterval(this._intervalId);
    }
}
 

И для вызова функции вы можете использовать некоторые объекты:

 const helper:Helpers = new Helpers();
helper.start();
 

Кроме того, убедитесь, что helper.start(); он вызывается не более одного раза, прежде чем будет остановлен с одним и тем же объектом. Чтобы правильно обработать этот крайний случай, вы можете проверить значение _intervalId in start() и выдать некоторую ошибку, если оно уже установлено. В случае stop() , если вы можете установить this._intervalId = null

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

1. Это отвратительно, почему вы делаете все статичным, когда для этого нет причин?? Просто используй this.interval .

Ответ №2:

 class Helpers {
    private _intervalRef;   

    start(): void {
        this._intervalRef = setInterval(function () { console.log('hello') }, 1000);
    }
    stop() {
        clearInterval(this._intervalRef);
    }
}

const helper:Helpers = new Helpers();

helper.start();

helper.stop();
 

Вы можете создать то же самое с приведенной выше ссылкой на код.

Ответ №3:

Вам также нужно сделать свой begin интервал статическим:

 class Helpers {
    static begin;

    static start(value: Vehicle): void {
        Helpers.begin= setInterval(value.calculateSpeed, 1000, value);
    }

    static stop() {
        clearInterval(Helpers.begin);
    }
}
 

Ответ №4:

Вы можете объявить begin and и stop как свойство класса, а затем сделать то же самое, что вы делаете сейчас!

Ответ №5:

begin является локальной переменной. Объявите его вне start, как показано ниже,

 class Helpers {

    static begin;
    static start(value: Vehicle): void {
        begin = setInterval(value.calculateSpeed, 1000, value);
    }
    static stop() {
        let stop = clearInterval(Helpers.begin);
    }
}