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

时间:2012-05-03 04:24:14

标签: 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();

}​

2 个答案:

答案 0 :(得分:10)

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

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

例如,以下是如何使用setTimeout计算最多五个:

var count = 0;
function timeoutFired() {
    count++;
    if(count < 5) {
        setTimeout(timeoutFired, 1000);
    }
}
setTimeout(timeoutFired, 1000);

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

以下是如何使用setInterval

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

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

答案 1 :(得分:2)

显然,setInterval错误setTimeoutsetInterval每隔 n毫秒运行封闭的函数setTimeout仅在n毫秒后执行一次。

我想你想要直到5&#34;所以here's a sample

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

    interval = setInterval(function() {
        if (i < 5) {

            //do something at this "tick"
            console.log(i);

            i++;
        } else {
            //else, stop
            clearInterval(interval);
        }
    },80);

}

increase();