为什么clearInterval不能在这段代码中工作?

und*_*ned 2 javascript setinterval

有一个函数设置一个间隔使用setInterval(),但即使在调用后clearInterval(),我可以在控制台中看到else条件仍在运行.如何正确清除该间隔?

function increase(old, step, neu) {
    var i = 0;
    var delay2;

    function countUp() {
        if (i < 5) {
            old += step;
            // console.log("increase")
            $("#total-price-value").text(old + " dollors");
            $("#total-price-value").digits();
            i++;
            delay2 = setInterval(countUp, 80);
        } else {
            clearInterval(delay2);
            console.log(delay2);
        }

    }
    countUp();

}?
Run Code Online (Sandbox Code Playgroud)

ick*_*fay 10

看起来你对超时和间隔之间的差异感到有点困惑.超时只发射一次; 间隔火多次.如果你正在使用一个间隔,你可能只想设置一次(你每次都设置它).如果您正在使用超时,您可能希望每次都设置它(就像您正在做的那样).

为了解决问题,你要么想要切换到超时(可能是最简单的;只是搜索/替换),要么只设置一次间隔.

例如,以下是一个人可能会使用setTimeout多达五个来计算:

var count = 0;
function timeoutFired() {
    count++;
    if(count < 5) {
        setTimeout(timeoutFired, 1000);
    }
}
setTimeout(timeoutFired, 1000);
Run Code Online (Sandbox Code Playgroud)

使用超时,我们不需要清除阻止计数; 只是不设置超时将阻止它再次运行.

以下是人们可能会使用的方式setInterval:

var count = 0;
function intervalFired() {
    count++;
    if(count >= 5) {
        clearInterval(interval);
    }
}
var interval = setInterval(intervalFired, 1000);
Run Code Online (Sandbox Code Playgroud)

如果您希望使用间隔定期运行某些代码来停止,则必须调用clearInterval.请注意,我们只调用setInterval一次,而不是setTimeout每次我们都不希望它继续.