我有一些相当复杂的逻辑:
var myArray = [];
var tempInterval = 0;
// Run for 6 minutes
for(i=0;i<360;i++) {
// Closure so that 'i' is the right value when setInterval runs
tempInterval = (function(i) {
interval1 = setInterval(function() {
console.log(i);
}, (i * 1000));
return interval1;
})(i);
// Put the setInterval value into an array
myArray.push(tempInterval);
}
我使用Closure
因为我需要i
的值为0,1,2,...etc
,如果你不使用闭包,那么在间隔时间它将是360执行。
如果你在控制台中运行它,你会看到它的运行方式超过360次。出于某种原因,它创造了太多的间隔。
我想要一个函数来停止setIntervals的执行:
for(i=0; i<myArray.length; i++) {
clearInterval(myArray[i]);
}
但是,因为它创造了太多,我无法阻止它。
例如,如果您在for(i=0; i<5; i++)
而不是for(i=0;i<360;i++)
内运行它,您会看到它仍然无限期地运行。
为什么要创建这么多间隔,如何让它只运行360次?另外,这是保存间隔的正确方法,所以我可以使用clearInterval
来停止执行吗?
答案 0 :(得分:2)
问题
setInterval
并不意味着“睡眠”,它意味着“每个时间段运行此功能”。
循环播放360次后,您拨打setInterval
说“每个 i
秒运行此功能。
所以你得到360倒计时,每次倒计时都会运行一个函数,然后重新开始倒计时再次运行该函数。
解决方案
请勿使用setInterval
。使用setTimeout
。
或者,或者:
我通常会避免同时设置360个计时器,而是执行以下操作:
var i = 0;
function next() {
console.log(i);
i++;
if (i < 360) {
setTimeout(next, 1000);
}
}
next();