0

clear が使用されると停止しない TimeOut があり、その理由がわかりません。

これは私の機能です:

function upgrade_bar(end, start, bar, timerId, func) {      

    var per = ( (new Date().getTime() / 1000) - start ) / ( end - start ) * 100;

    if(per>100)per=100;
    if(per<0)per = 0;

    if(per == 0) {
        bar.style.width = per + "%";
    } else if(per == 100) {
        clearTimeout(timerId); //this does not stop it
        if(func !== false){
            func(); //this does call at 100%
        }
    } else{
        bar.style.width = per+ "%";
    }
    console.log('still going');
    timerId = setTimeout(function() { upgrade_bar(end, start, bar, timerId, func) } , 17);
}

私はこれについて何を誤解しましたか? timerId は、タイムアウトの ID を保持してクリアすることはできませんか?

4

2 に答える 2

2

setTimeout()関数のもう 1 つの実行をスケジュールするだけです。

clearTimeout()時間に達する前に次のタイムアウトを停止するために使用できます-しかし、タイムアウトに達して関数が呼び出されると、タイムアウトをクリアしても何もしません-とにかく再び実行されることはありませんでした.

ここでの問題は、関数で何が起こるかに関係なく、 setTimeout を再度呼び出すことで終了し、再度実行するようにスケジュールすることです。


考えられる解決策は、関数を次のように書き直すことです。

function upgrade_bar(end, start, bar, func){       
    var per = ( (new Date().getTime() / 1000) - start ) / ( end - start ) * 100;
    if (per>100) per=100;
    if (per<0) per = 0;

    bar.style.width = per + "%";

    if (per == 100) {
        if (func !== false) {
            func(); //this does call at 100%
        }
    } else {
        console.log('still going');
        setTimeout(function() { upgrade_bar(end, start, bar, func) } , 17);
    }
}
于 2013-07-14T00:11:12.707 に答える
0

setTimeout()指定された関数を 1 回実行します。あなたが考えている はsetInterval()、キャンセルされるまで実行されます。

あなたの場合、clearTimeout()呼び出されますが、コードパスが取られても、コードは引き続き別のタイムアウトを設定します。

タイムアウトの再設定を避けるためreturnに、呼び出し後に ing を試してください。func()

于 2013-07-14T00:13:47.807 に答える