2011-05-12 119 views
61
function doKeyDown(event) { 
    switch (event.keyCode) { 
    case 32: 
     /* Space bar was pressed */ 
     if (x == 4) { 
      setInterval(drawAll, 20); 
     } 
     else { 
      setInterval(drawAll, 20); 
      x += dx; 
     } 
     break; 
    } 
} 

大家好,如何使用setInterval和clearInterval?

我想打電話給drawAll()一次沒有建立一次又一次叫drawAll,我應該使用遞歸的方法爲,或者我應該使用clearInterval

也請告訴我使用clearInterval?謝謝:)

回答

120

setInterval建立一個經常性定時器。它返回一個可以傳遞到clearInterval把手從點火停止:

var handle = setInterval(drawAll, 20); 

// When you want to cancel it: 
clearInterval(handle); 
handle = 0; // I just do this so I know I've cleared the interval 

在瀏覽器,手柄保證是一個數字,不等於0;因此,0爲「無定時器設置」提供了方便的標誌值。 (其他平臺可能會返回其他值;的NodeJS定時器函數返回一個對象,例如。)

要安排一個函數來火一次,使用setTimeout來代替。它不會繼續射擊。 (這也返回一個句柄可以使用通過clearTimeout取消它它觸發一個時間,如果合適的了。)

setTimeout(drawAll, 20); 
10

改爲使用setTimeout(drawAll, 20)。那隻會執行一次該功能。

+0

非常感謝,但setTimeout正在完成每個點處的循環,我使用其他方法並且它的工作正常,函數doKeyDown(event){switch.keyCode} {0} 0 {0} */ loop = setInterval(drawAll,20); (x == 202)x = 400; spinner(); } break; } } – Raj 2011-05-24 10:10:58

11

clearInterval是一個選項:

var interval = setInterval(doStuff, 2000); // 2000 ms = start after 2sec 
function doStuff() { 
    alert('this is a 2 second warning'); 
    clearInterval(interval); 
} 
+7

切勿在'setInterval'或'setTimeout'中使用字符串。 – 2011-05-12 13:19:04

+1

你的意思是我應該刪除doStuff()周圍的引號? – 2011-05-12 13:23:15

+9

是的,這兩個報價和parens。簡單地說:'setInterval(doStuff);'。將一個字符串傳遞給'setInterval'是對'eval'的隱式調用。最好傳遞函數* reference *來代替。 – 2011-05-12 13:28:30

1

邊注 - 如果要使用單獨的函數來設置&明確的時間間隔,間隔變量必須爲所有這些訪問,在「相對全球」或「上一級」範圍:

var interval = null;  

function startStuff(func, time) { 
    interval = setInterval(func, time); 
} 

function stopStuff() { 
    clearInterval(interval); 
} 
0

我用角與電子,

在我的情況下,setInterval返回的NodeJS Timer對象。當我打電話給clearInterval(timerobject)時它沒有工作。

我必須先拿到ID,並呼籲給clearInterval

clearInterval(timerobject._id)

我一直在努力很多時間與此有關。希望這可以幫助。

相關問題