如何使用JavaScript中的nested settimeout()函数打破循环



情况

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

我当前的解决方案

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

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

}

问题

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

您是否尝试过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);
    }

}

最新更新