gpt4 book ai didi

javascript - SetInterval 在闭包内,在 For 循环内,创建了太多间隔,不会停止运行

转载 作者:行者123 更新时间:2023-12-02 17:52:46 25 4
gpt4 key购买 nike

我有一些相当复杂的逻辑:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com