วิธีใช้ setInterval และ 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;
    }
}

สวัสดีทุกคน,

ฉันต้องการโทรdrawAll()เมื่อไม่สร้างลูปที่โทรdrawAllซ้ำแล้วซ้ำอีกฉันควรใช้วิธีการเรียกซ้ำสำหรับสิ่งนั้นหรือฉันควรใช้clearInterval?

ยังช่วยบอกให้ฉันใช้clearInterval? ขอบคุณ :)

คำตอบ:


218

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);

31

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
TJ Crowder

1
คุณหมายความว่าฉันควรลบเครื่องหมายคำพูดรอบ ๆ doStuff ()?
Joshua - Pendo

9
ใช่ทั้งคำพูดและราคา เพียงแค่: setInterval(doStuff);. ผ่านสตริงเข้าเป็นสายส่อไปsetInterval evalดีที่สุดที่จะส่งในการอ้างอิงฟังก์ชันแทน
TJ Crowder

1
อืมการโหวตลดลงอาจจะยุติธรรม .. ฉันแสดงตัวอย่างที่ไม่ถูกต้อง (แม้ว่าจะใช้ได้ในกรณีของฉัน แต่ฉันก็เปลี่ยนสิ่งเหล่านี้เมื่อเราพูด) ยกนิ้วให้! :)
Joshua - Pendo

10

ใช้setTimeout(drawAll, 20)แทน ที่เรียกใช้ฟังก์ชันเพียงครั้งเดียว


ขอบคุณมาก แต่ setTimeout กำลังจบลูปในแต่ละจุดฉันใช้วิธีการอื่นและทำงานได้ดีฟังก์ชัน doKeyDown (เหตุการณ์) {สวิตช์ (event.keyCode) {case 32: / * Space bar ถูกกด * / loop = setInterval (drawAll, 20); ถ้า (x == 202) {x = 400; ตัวหมุน(); } หยุดพัก; }}
Raj

ไม่ใช่คำถามที่
Nino Škopac

9

ฉันใช้เชิงมุมกับอิเล็กตรอน

ในกรณีของฉันsetIntervalส่งคืนวัตถุ Nodejs Timer ซึ่งเมื่อฉันโทรclearInterval(timerobject)มันก็ไม่ได้ผล

ฉันต้องได้รับ id ก่อนและโทรไปที่ clearInterval

clearInterval(timerobject._id)

ฉันดิ้นรนหลายชั่วโมงกับเรื่องนี้ หวังว่านี่จะช่วยได้


6

หมายเหตุด้านข้าง - หากคุณต้องการใช้ฟังก์ชันแยกกันเพื่อกำหนด & ล้างช่วงเวลาตัวแปรช่วงเวลาจะต้องสามารถเข้าถึงได้สำหรับตัวแปรทั้งหมดในขอบเขต 'สัมพัทธ์โกลบอล' หรือ 'ระดับขึ้นหนึ่งระดับ':

var interval = null;    

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

function stopStuff() {
    clearInterval(interval);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.