2015-04-05 33 views
0

我有一个JavaScript函数。我使用setInterval来控制我的功能。我还有另一个控制我的功能的逻辑。我有一个柜台,一旦发生一种情况就会增加,而另一种情况发生时会减少。现在,有时第二种情况不会发生,因此我的功能将不再恢复。 (当我的第一个情况发生时,我暂停我的功能)。因此,我想等待第二个条件最多30秒。如果它没有发生,那么我想要恢复我的功能。我有以下代码,但它不能像我期望的那样工作。会发生什么事是它每30秒恢复一次我的功能。然后,它可能会恢复,而它应该等待。有人能让我知道我的代码有什么问题吗?在JavaScript中定义一个计时器

请注意,计数器的值可能会增加到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); 
    } 
} 
+0

这两个函数是如何被调用的?你可以通过jsfiddle建立一个简单的演示吗? – Joseph 2015-04-05 03:29:42

+0

说实话,这有点困难,因为这是我的大项目的一小部分!实际上我使用PhantomJS,这两个函数是它的两个回调函数。 – Suo6613 2015-04-05 03:37:51

+1

你必须在每个'x = setInterval(...)'语句之前加上'clearInterval(x);'。 – Wio 2015-04-07 20:48:20

回答

0

为什么不

var counter = 0 
var timeout = null 

function main() { 
    clearTimeout(timeout); 
    timeout = null; 
} 

function increaseCounter() { 
    counter++; 
    if (!timeout) 
     timeout = setTimeout(main, 30*1000); 
} 

function decreaseCounter() { 
    counter--; 
    if (counter === 0) 
     main(); 
} 
2

考虑,如果你连续叫increaseCounter两次会发生什么。

在第一次执行时,它会创建区间A并将其分配给controlSecond

在第二执行它会创建间隔B并将其分配给controlSecond,而间隔A继续无限期地断火。您不会因为clearInterval(controlSecond)而停止它,因为controlSecond不再引用区间A

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

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

我也建议你实施controlSecond,因为它是为只发生一次的任务设计的。

+0

我明白你的观点是正确的!但是,我不想使用'setTimeout',因为我希望我的函数在准备好时恢复。但是,使用'setTimeout'我必须每次等待3秒钟。对于某些行为来说这太多了,对其他一些行动可能会少一些。在再次设置它们之前,如何“清除”我的“间隔”? – Suo6613 2015-04-05 14:15:53