web-dev-qa-db-ja.com

例外を引き起こすsetInterval()からメソッドを呼び出す

SetInterval()から関数を呼び出したいのですが。アイデアは次のとおりです。

class Greeter {
    element: HTMLElement;
    span: HTMLElement;
    timerToken: number;

    constructor(element: HTMLElement) {
        this.element = element;
        this.element.innerHTML += "The time is: ";
        this.span = document.createElement('span');
        this.element.appendChild(this.span);
        this.span.innerText = new Date().toUTCString();
        //this.element.style.cssText = "-webkit-transform:rotate(7deg)";     
        //this.element.style.transition = "-webkit-transform: rotate(180deg)";         
    }

    start() {
        this.timerToken = setInterval(this.runningLoop(this.element), 500);        
    }

    stop() {
        clearTimeout(this.timerToken);
    }

    runningLoop(element: HTMLElement) {
        this.element.style.cssText = "-webkit-transform:rotate(7deg)";         
    }


}

window.onload = () => {
    var el = document.getElementById('content');
    var greeter = new Greeter(el);

    greeter.start();
};        

この場合、例外が発生します。

13行9列の未処理の例外。MicrosoftJScriptランタイムエラー:引数が無効です。

だから私は次のように試しました:

this.timerToken = setInterval(function () { this.runningLoop(this.element) }.bind, 500);

例外はありませんが、何も起こりません。

何か案は ?

7
Jviaches
setInterval(this.runningLoop(this.element), 500);

上記は、setIntervalに渡す前にthis.runningLoopを呼び出し、setIntervalは関数を期待していますが、undefinedを受信して​​います。呼び出しを矢印関数でラップします。

setInterval(() => this.runningLoop(this.element), 500);

また、runningLoopで要素引数を使用していないため、引数を削除してメソッドをsetInterval ..に渡すことができます。

setInterval(this.runningLoop, 500);
19
Anthony Chu

これは、必要な時間にループします。setInterval(()=> function()、time in miliseconds);

さて、いつでもやめたいなら!間隔の前に変数を記述します。TSファイルの先頭で宣言します。varInterval:any; this.varInterval = setInterval(()=> function()、ミリ秒単位の時間);

次のようにメソッドを呼び出して停止できます。clearInterval(this.varInterval);

これは私のために働きます!

1
Carlos Galeano