Я пытаюсь создать кнопку, которая остановит метод, запускающий 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() ничего не делает. Любая помощь будет очень высоко ценится.
Большое спасибо за вашу помощь, ребята! Вы решили мою проблему!
let относится к функции, а не к классу или экземпляру. Я бы ожидал что-то вроде Helpers.begin = setInterval(), но затем написанный синтаксисом машинописного текста (если он отличается).
Зачем вам эти фиктивные классы? Просто используйте setInterval там, где ему место в коде.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам нужно, чтобы ссылочная переменная была статической. В настоящее время переменная 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.
Вам также нужно сделать статическим интервал 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);
}
}
Helpers.begin— этоundefined, потому чтоbegin— локальная переменная.