SetInterval ve clearInterval nasıl kullanılır?


138
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;
    }
}

Herkese selam,

Ben aramak istediğiniz drawAll()zamanlar oluşturarak değil döngü diyoruz drawAll, tekrar tekrar bunun için özyinelemeli yöntemi kullanmalısınız veya kullanmalıyım clearInterval?

Lütfen bana kullanmamı söyle clearInterval? Teşekkürler :)

Yanıtlar:


210

setIntervalyinelenen bir zamanlayıcı ayarlar . clearIntervalAteş etmesini durdurmak için geçebileceğiniz bir tanıtıcı döndürür :

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

Tarayıcılarda, tutamacın eşit olmayan bir sayı olması garanti edilir 0; bu nedenle, 0"zamanlayıcı ayarlanmadı" için kullanışlı bir bayrak değeri oluşturur. (Diğer platformlar başka değerler döndürebilir; Örneğin, NodeJS'nin zamanlayıcı işlevleri bir nesneyi döndürür.)

Bir işlevi yalnızca bir kez ateşlenecek şekilde zamanlamak için , setTimeoutbunun yerine kullanın. Ateş etmeye devam etmeyecek. (Ayrıca clearTimeout, uygunsa bir kez tetiklenmeden önce iptal etmek için kullanabileceğiniz bir tanıtıcı döndürür .)

setTimeout(drawAll, 20);

29

clearInterval bir seçenektir:

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

7
Asla setIntervalveya ile dizeler kullanmayın setTimeout.
TJ Crowder

1
doStuff () ile ilgili tırnak işareti kaldırmalıyım demek istiyorsun?
Joshua - Pendo

9
Evet, hem tırnak işaretleri hem de parenler. Basitçe: setInterval(doStuff);. Bir dizgiyi iletmek setInterval, örtük bir çağrıdır eval. Bunun yerine işlev referansını geçmek en iyisidir.
TJ Crowder

1
Ah, downvote belki de adil .. Doğru olmayan bir örnek gösterdim (vakalarımda çalışmasına rağmen, ama konuşurken bunları değiştiriyorum). Başparmak havaya! :)
Joshua - Pendo

10

setTimeout(drawAll, 20)Bunun yerine kullanın . Bu işlevi yalnızca bir kez yürütür.


Çok teşekkürler, ancak setTimeout her noktada döngüyü bitiriyor, diğer yaklaşımı ve iyi çalışıyor, fonksiyon doKeyDown (event) {switch (event.keyCode) {case 32: / * Boşluk çubuğuna basıldı * / loop = setInterval (drawAll, 20); eğer (x == 202) {x = 400; değiştirici (); } ara; }}
Raj

tho değildi
Nino Škopac

8

Elektron ile açısal kullandım,

Benim durumumda, setIntervalbir Nodejs Timer nesnesi döndürür. aradığımda clearInterval(timerobject)işe yaramadı.

Önce kimliği almam ve clearInterval'ı aramam gerekiyordu

clearInterval(timerobject._id)

Bununla saatlerce uğraştım. Bu yardımcı olur umarım.


5

Yan not - aralığı ayarlamak ve temizlemek için ayrı işlevler kullanmak istiyorsanız, aralık değişkeninin hepsi için 'göreceli küresel' veya 'bir seviye yukarı' kapsamında erişilebilir olması gerekir:

var interval = null;    

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

function stopStuff() {
    clearInterval(interval);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.