javascript - 无法清除超时

标签 javascript

我有一个超时,一旦使用清除就不会停止,我不确定为什么。

这是我的功能:

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让我清除吗?

最佳答案

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

关于javascript - 无法清除超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17635319/

相关文章:

javascript - 如何按顺序执行 jQuery AJAX 调用?

javascript - Python 添加新控件会出现错误

javascript - 标记在 select2 中不起作用

Javascript 为什么 onClick 被回车键调用

javascript - 在显示模态之前加载模态内容

javascript - jquery 设置变量输入字段值

javascript - screen.getByText 不是函数

javascript - 在完成之前,事情发生在我的 for 循环之外(javascript)

javascript - 由于上下文中未使用的属性,组件重新呈现

javascript - Node.js fs.open() 在尝试打开超过 4 个命名管道 (FIFO) 后挂起