javascript - 如何在 JavaScript 中使用嵌套的 setTimeout() 函数打破 for 循环?

标签 javascript for-loop settimeout

情况

我有一个在单击按钮时调用的函数,该函数应该绘制一个动画图表,每 2 秒更新一次图表。当用户再次单击该按钮时,当动画仍在运行时,动画应该停止。

我当前的解决方案

现在我有以下脚本,可以在视觉上停止动画,但底层的 for 循环将继续,直到后台结束:

var animRun = false;
$("#animateButton").on("click", function() {
    if (animRun === false) {
        redraw(data.slice(0,30))
        //some CSS...

    } else {
        //Some CSS...
        animRun = false;
    }
});

function redraw(data) {
    animRun = true;

    for (var i=0; i<data.length;i++){

        (function(i){
            setTimeout(function(){
                if(animRun === true) {
                    //draw the chart
                    return draw(data[i])
                }
            },2000*(i))

            if (i === data.length -1) {
                //reset animRun
                if(animRun === true) {
                     //Some CSS things
                     //...
                     animRun = false;
                 }
            }
        })(i);
    }


}

问题

当用户在动画仍在执行时再次单击按钮时停止 for 循环的正确方法是什么?

最佳答案

您是否尝试过clearTimeout。将绘制超时存储到数组中,并在完成后停止

var animRun = false;
var drawArr = [];
$("#animateButton").on("click", function() {
    if (animRun === false) {
        redraw(data.slice(0,30))
        //some CSS...

    } else {
        //Some CSS...
        animRun = false;

        drawArr.forEach(d=>clearTimeout(d));
    }
});

function redraw(data) {
    animRun = true;

    for (var i=0; i<data.length;i++){

        (function(i){
            drawArr[i] = setTimeout(function(){
                if(animRun === true) {
                    //draw the chart
                    return draw(data[i])
                }
            },2000*(i))

            if (i === data.length -1) {
                //reset animRun
                if(animRun === true) {
                     //Some CSS things
                     //...
                     animRun = false;
                 }
            }
        })(i);
    }


}

关于javascript - 如何在 JavaScript 中使用嵌套的 setTimeout() 函数打破 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56248955/

相关文章:

javascript - 如何测试 axios 包装器

c++ - auto 是基于 for 循环的范围内的可选关键字吗?

javascript 属性类型 IE9

javascript - onclick 即使在加载 map 后 - ammap

swift - [AnyObject] ?' does not have a member named ' 生成器'

javascript - window.print() 尝试在完成渲染之前打印一个页面(动态创建的)

javascript - setTimeout 给出 'result of expression is not a function' 错误

javascript - 了解 JavaScript 中的自动页面刷新

javascript - 如何通过点击随机改变按钮的背景颜色?

python - 如何停止 Python 线程中的 for 循环?