#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);
}
}