0

我有一个 TimeOut,一旦使用 clear 就不会停止,我不确定为什么。

这是我的功能:

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()只是安排再次执行该功能。

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()导致指定函数的一次执行。您正在考虑setInterval(),它会一直执行直到取消。

在您的情况下,clearTimeout()被调用,但无论采用什么代码路径,代码都会继续设置另一个超时。

调用后尝试returningfunc()以避免再次设置超时。

于 2013-07-14T00:13:47.807 回答