我有一个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。

问题是您继续将controlSecondcontroller设置为新的间隔而没有先清除它们。这导致间隔泄漏而无法清除它们。这有点像内存泄漏,其中您已动态分配了内存,但没有指向内存,而是使用了重新分配间隔,而不是重新分配内存。

防止这种情况的一种方法是确保在设置间隔之前始终清除间隔。

我还建议您使用controlSecond实现setTimeout,因为这是为仅发生一次的任务而设计的。

关于javascript - 在JavaScript中定义计时器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29453781/

10-09 23:25