我无法找到一种方法来停止调用函数之外的间隔计时器。我在以下代码中遗漏了什么?我是否需要专门声明一个名为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);

答案 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);
}
}
答案 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版本中工作。