- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些相当复杂的逻辑:
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
阻止他们的执行?
最佳答案
问题
setInterval
并不意味着“ sleep ”,它的意思是“每个时间段运行此函数”。
每次循环 360 次时,您都会调用 setInterval
并说“每 i
秒运行此函数。
因此,您会得到 360 个倒计时,每个倒计时都会在倒计时为零时运行一个函数,然后重新启动倒计时以再次运行该函数。
<小时/>解决方案
不要使用setInterval
。使用setTimeout
。
或者,另一种选择:
我通常会避免设置同时运行的 360 个计时器,而是执行以下操作:
var i = 0;
function next() {
console.log(i);
i++;
if (i < 360) {
setTimeout(next, 1000);
}
}
next();
关于javascript - SetInterval 在闭包内,在 For 循环内,创建了太多间隔,不会停止运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21212465/
我正在尝试对 StockData 表执行 OHCL sql 查询 (SQL Server 2012)。每天有数千行添加到表中,我想获取每天的开盘价、最高价、最低价和收盘价数据。 建表sql如下:
我是一名优秀的程序员,十分优秀!