我有一个JavaScript函数。我使用setInterval
来控制我的功能。我还有另一个逻辑来控制我的功能。我有一个计数器,一旦一种情况发生,计数器就会增加,而在另一种情况发生时,计数器就会减少。现在,有时第二个条件不会发生,因此我的功能将不再恢复。 (我的第一个条件发生时,我暂停了功能)。因此,第二种情况我最多要等待30秒。如果没有发生,那么我还是想恢复我的功能。我有以下代码,但无法正常运行。发生的情况是它每30秒恢复一次功能。然后,可以在等待时恢复它。有人可以让我知道我的代码有什么问题吗?
请注意,计数器的值可能会增加到20以上。我的意思是第一种情况和第二种情况可能会发生多次。
function main()
{
// body
}
function increaseCounter()
{
counter += 1;
clearInterval(controller);
controlSecond = setInterval(function(){
counterSeconds += 1;
if (counterSeconds == 30)
{
counterSeconds = 0;
controller = setInterval(main, 100);
clearInterval(controlSecond);
}
}, 1000);
}
function decreaseCounter()
{
counter -= 1;
if (counter == 0)
{
counterSeconds = 0;
clearInterval(controlSecond);
controller = setInterval(main, 100);
}
}
最佳答案
考虑如果连续两次调用increaseCounter
会发生什么。
在第一次执行时,它将创建间隔A并将其分配给controlSecond
。
在第二次执行时,它将创建间隔B并将其分配给controlSecond
,而间隔A会继续无限期触发。您不会使用clearInterval(controlSecond)
停止它,因为controlSecond
不再引用间隔A。
问题是您继续将controlSecond
和controller
设置为新的间隔而没有先清除它们。这导致间隔泄漏而无法清除它们。这有点像内存泄漏,其中您已动态分配了内存,但没有指向内存,而是使用了重新分配间隔,而不是重新分配内存。
防止这种情况的一种方法是确保在设置间隔之前始终清除间隔。
我还建议您使用controlSecond
实现setTimeout
,因为这是为仅发生一次的任务而设计的。
关于javascript - 在JavaScript中定义计时器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29453781/