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

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

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

Helpers.begin — это undefined, потому что begin — локальная переменная.
Roland Starke 18.04.2019 12:43

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

Shilly 18.04.2019 12:44

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

georg 18.04.2019 12:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
85
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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

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

Mykybo 18.04.2019 12:57

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

class Helpers {
    static begin;

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

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

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

class Helpers {
    private _intervalRef;   

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

const helper:Helpers = new Helpers();

helper.start();

helper.stop();

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

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

class Helpers {

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

Другие вопросы по теме