2

有一个使用 设置间隔的函数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();

}​
4

2 回答 2

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每次我们不希望它继续。

于 2012-05-03T04:27:20.463 回答
2

显然,您误setInterval认为setTimeout. 毫秒setInterval运行一次封闭的函数,而在毫秒后只执行一次。 nsetTimeoutn

我想你想“打勾直到 5”所以这里有一个示例

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();
于 2012-05-03T04:32:16.797 回答