Как остановить Интервал? - PullRequest
       9

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

2 голосов
/ 18 апреля 2019

Я пытаюсь создать кнопку, которая остановит метод, выполняющий 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 () - нетДелать что-нибудь.Буду очень признателен за любую помощь.

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

Ответы [ 5 ]

1 голос
/ 18 апреля 2019
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();

Вы можете создать то же самое с указанным выше кодом.

1 голос
/ 18 апреля 2019

Требуемая переменная должна быть статической. В настоящее время переменная 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 не очень хорошая идея, так как вы можете использовать этот класс Helper в нескольких местах одновременно. Если сделать его статическим, то будет создана единственная копия переменной, что может привести к проблемам.

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

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 в start() и выдать некоторую ошибку, если она уже установлена. В случае stop() вы можете установить this._intervalId = null

0 голосов
/ 18 апреля 2019

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

class Helpers {

    static begin;
    static start(value: Vehicle): void {
        begin = setInterval(value.calculateSpeed, 1000, value);
    }
    static stop() {
        let stop = clearInterval(Helpers.begin);
    }
}
0 голосов
/ 18 апреля 2019

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

0 голосов
/ 18 апреля 2019

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

class Helpers {
    static begin;

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

    static stop() {
        clearInterval(Helpers.begin);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...