在启动范围之外清除超时?

时间:2015-03-23 12:42:18

标签: javascript timer

我无法找到一种方法来停止调用函数之外的间隔计时器。我在以下代码中遗漏了什么?我是否需要专门声明一个名为timer的全局变量?



var timer;  // global timer?

function updateStats(i) {
     i++; // increment
     alert("Im running! increment is " + i);

     checkCondition(i);

     timer = setInterval(function() {
         updateStats(i);
     }, 5000);
}

function checkCondition(i) {
     if(i == 2) {
        alert("condition met, resetting timer!");
        clearInterval(timer);
     }
}

var i = 0;
updateStats(i);




5 个答案:

答案 0 :(得分:0)

仅创建一次计时器:

var timer;  // global timer?

function updateStats() {
     i++; // increment
     alert("Im running! increment is " + i);

     checkCondition(i);
}

function checkCondition(i) {
     if(i == 2) {
        alert("condition met, resetting timer!");
        clearInterval(timer);
     }
}

var i = 0;
timer = setInterval(updateStats, 5000);

答案 1 :(得分:0)

它确实有效,你确实清除了超时,问题是你每次调用updateStats时都会创建多个计时器,并且每次都要覆盖计时器,而忽略了其他计时器的句柄。你为什么每次都调用创建新计时器的函数,你添加了很多计时器?

我猜你真的想要这样做,其中间隔只创建一次,而不是每次迭代

var timer;

function updateStats(i) {
    function inner() {
        i++;
        alert("Im running! increment is " + i);
        checkCondition(i);
    }

    timer = setInterval(inner, 5000);
    inner();
}

function checkCondition(i) {
     if(i == 2) {
        alert("condition met, resetting timer!");
        clearInterval(timer);
    }
}

var i = 0;
updateStats(i);

答案 2 :(得分:0)

每次运行updateStats时,都会创建一个间隔计时器。

在该间隔计时器内运行updateStats

因此,当代码首次运行时,您将运行1个内部计时器。

5秒后你就有了2.在10秒之后,每个间隔开始一个新的间隔,所以你有4个,依此类推。

它们都共享一个timer变量,因此它的值将是您设置的最后一个间隔,而且是您停止的唯一间隔。 (当所有其他人继续运行时,你运行的间隔计时器的数量翻了5倍。

您需要认真重构代码。

答案 3 :(得分:0)

您正在清除计时器,然后立即立即设置一个全新的计时器。 setInterval也只需要调用一次。目前,每次调用循环时,都会生成另一个计时器实例,而您只清除最后一个实例。

看看这个:

var timer,i=0; 
 timer = setInterval(function() {
        updateStats();
 }, 5000);

function updateStats() {
    i++; // increment
    alert("Im running! increment is " + i);

    checkCondition();

}

function checkCondition() {
     if(i == 2) {
        alert("condition met, resetting timer!");
        clearInterval(timer);
    }
}

http://jsfiddle.net/ctaylr/bLz7k7oc/

答案 4 :(得分:0)

让我彻底简化您的代码:

loop(0, 1000);

function loop(count, delay) {
    alert("I am running. The count is " + (++count) + ".");
    if (count === 2) alert("Condition met, stopping loop.");
    else setTimeout(loop, delay, count, delay);
}
<!--[if lte IE 9]>
<script>
    (function (window, setTimeout, setInterval) {
        window.setTimeout  = fix(setTimeout);
        window.setInterval = fix(setInterval);

        function fix(timer) {
            return function (callback, interval) {
                var length = arguments.length;

                switch (length) {
                case 0:
                case 1:
                    throw new Error("expected at least two arguments");
                case 2:
                    return timer(callback, interval);
                default:
                    var i = 2;
                    var args = new Array(length - 2);
                    while (i < length) args[i - 2] = arguments[i++];
                    return timer(backcall, interval);
                }

                function backcall() {
                    return callback.call(this, args);
                }
            };
        }
    }(window, setTimeout, setInterval));
</script>
<![endif]-->

由于我们使用setTimeout的方式(即使用额外的参数),如果不是我包含的条件polyfill,上面的代码将不会在小于9的Internet Explorer版本中工作。