如何停止间隔?

时间:2019-04-18 10:41:09

标签: javascript typescript function oop methods

我正在尝试创建一个按钮,该按钮将停止运行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 个答案:

答案 0 :(得分:1)

您需要引用的变量是静态的。当前,变量beginstart函数的局部变量。另外,您不需要保留clearInterval返回的值的引用。 begin的更好名称是intervalintervalId

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();被同一对象停止之前没有被多次调用。为了正确处理这种情况,您可以检查_intervalIdstart()的值,如果已经设置,则会抛出一些错误。如果是stop(),则可以设置this._intervalId = null

答案 1 :(得分:1)

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();

您可以使用以上代码参考来创建相同的内容。

答案 2 :(得分:0)

您还需要将begin间隔设为静态:

class Helpers {
    static begin;

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

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

答案 3 :(得分:0)

您可以在类属性中声明beginstop,然后执行与现在相同的操作!

答案 4 :(得分:0)

begin是局部变量。在开始之外声明它,如下所示:

class Helpers {

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