2015-04-05 64 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