Bagaimana cara menggunakan setInterval dan clearInterval?

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

Halo semua,

Saya ingin menelepon drawAll()sekali tidak membuat loop panggilan itu drawAlllagi dan lagi, haruskah saya menggunakan metode rekursif untuk itu atau haruskah saya gunakan clearInterval?

Juga tolong beritahu saya untuk menggunakan clearInterval? Terima kasih :)

Raj
sumber

Jawaban:

218

setIntervalmengatur pengatur waktu berulang . Ini mengembalikan pegangan yang bisa Anda lewati clearIntervaluntuk menghentikannya menembak:

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

Pada browser, pegangan dijamin berupa angka yang tidak sama dengan 0; oleh karena itu, 0buatlah nilai flag berguna untuk "tidak ada timer set". (Platform lain mungkin mengembalikan nilai lain; fungsi timer NodeJS mengembalikan objek, misalnya.)

Untuk menjadwalkan fungsi agar hanya diaktifkan sekali, gunakan setTimeoutsebagai gantinya. Ini tidak akan terus menembak. (Ini juga mengembalikan pegangan yang dapat Anda gunakan untuk membatalkannya melalui clearTimeoutsebelum mengaktifkannya satu kali jika sesuai.)

setTimeout(drawAll, 20);
TJ Crowder
sumber
31

clearInterval adalah salah satu opsi:

var interval = setInterval(doStuff, 2000); // 2000 ms = start after 2sec 
function doStuff() {
  alert('this is a 2 second warning');
  clearInterval(interval);
}
Joshua - Pendo
sumber
7
Jangan pernah menggunakan string dengan setIntervalatau setTimeout.
TJ Crowder
1
maksud Anda saya harus menghapus tanda kutip di sekitar doStuff ()?
Joshua - Pendo
9
Ya, baik tanda kutip maupun parens. Cukup: setInterval(doStuff);. Meneruskan string ke dalam setIntervaladalah panggilan implisit ke eval. Lebih baik meneruskan referensi fungsi sebagai gantinya.
TJ Crowder
1
Ah well, downvote-nya mungkin adil .. Saya menunjukkan contoh yang tidak benar (meskipun berhasil dalam kasus saya, tetapi saya mengubahnya saat kita berbicara). Jempolan! :)
Joshua - Pendo
10

Gunakan setTimeout(drawAll, 20)sebagai gantinya. Itu hanya menjalankan fungsi sekali.

dlev
sumber
Terima kasih banyak, tetapi setTimeout menyelesaikan loop di setiap titik, saya menggunakan pendekatan lain dan berfungsi dengan baik, fungsi doKeyDown (event) {switch (event.keyCode) {case 32: / * Space bar ditekan * / loop = setInterval (drawAll, 20); jika (x == 202) {x = 400; pemintal(); } istirahat; }}
Raj
itu bukan pertanyaannya
Nino Škopac
9

Saya menggunakan sudut dengan elektron,

Dalam kasus saya, setIntervalmengembalikan objek Timer Nodejs. yang ketika saya menyebutnya clearInterval(timerobject)tidak berhasil.

Saya harus mendapatkan id terlebih dahulu dan menelepon ke clearInterval

clearInterval(timerobject._id)

Saya telah berjuang berjam-jam dengan ini. semoga ini membantu.

PJ3
sumber
6

Catatan tambahan - jika Anda ingin menggunakan fungsi terpisah untuk mengatur & menghapus interval, variabel interval harus dapat diakses untuk semuanya, dalam lingkup 'relative global', atau 'satu level up':

var interval = null;    

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

function stopStuff() {
    clearInterval(interval);
}
HynekS
sumber