Làm thế nào để sử dụng setInterval và clearInterval?


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

Chào mọi người,

Tôi muốn gọi drawAll()một lần không tạo vòng lặp mà gọi đi gọi drawAlllại, tôi nên sử dụng phương thức đệ quy cho điều đó hay tôi nên sử dụng clearInterval?

Ngoài ra xin vui lòng cho tôi biết để sử dụng clearInterval? Cảm ơn :)

Câu trả lời:


210

setIntervalthiết lập một bộ đếm thời gian định kỳ . Nó trả về một tay cầm mà bạn có thể truyền vào clearIntervalđể ngăn nó bắn:

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

Trên các trình duyệt, tay cầm được đảm bảo là một số không bằng 0; do đó, 0tạo một giá trị cờ tiện dụng cho "không có bộ hẹn giờ". (Ví dụ, các nền tảng khác có thể trả về các giá trị khác; chức năng hẹn giờ của NodeJS trả về một đối tượng.)

Để lên lịch một chức năng chỉ bắn một lần, setTimeoutthay vào đó hãy sử dụng . Nó sẽ không tiếp tục bắn. (Nó cũng trả về một tay cầm mà bạn có thể sử dụng để hủy bỏ nó clearTimeouttrước khi nó kích hoạt một lần nếu thích hợp.)

setTimeout(drawAll, 20);

29

ClearInterval là một lựa chọn:

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

7
Không bao giờ sử dụng chuỗi có setIntervalhoặc setTimeout.
TJ Crowder

1
ý bạn là tôi nên xóa các trích dẫn xung quanh doStuff ()?
Joshua - Pendo

9
Vâng, cả trích dẫn và parens. Đơn giản là : setInterval(doStuff);. Truyền một chuỗi vào setIntervallà một cuộc gọi ngầm đến eval. Tốt nhất để vượt qua trong các tham chiếu chức năng thay thế.
TJ Crowder

1
À, downvote có lẽ là công bằng .. Tôi đã đưa ra một ví dụ không đúng (mặc dù nó hoạt động trong trường hợp của tôi, nhưng tôi đang thay đổi những điều này khi chúng ta nói). Đồng ý :)
Joshua - Pendo

10

Sử dụng setTimeout(drawAll, 20)thay thế. Điều đó chỉ thực hiện chức năng một lần.


Cảm ơn rất nhiều, nhưng setTimeout đang hoàn thiện vòng lặp tại mỗi điểm, tôi sử dụng cách tiếp cận khác và hoạt động tốt, hàm doKeyDown (event) {switch (event.keyCode) {case 32: / * Thanh không gian được nhấn * / loop = setInterval (vẽ Tất cả, 20); if (x == 202) {x = 400; spinner (); } phá vỡ; }}
Raj

đó không phải là câu hỏi tho
Nino kopac

7

Tôi đã sử dụng góc với điện tử,

Trong trường hợp của tôi, setIntervaltrả về một đối tượng Timer Nodejs. mà khi tôi gọi clearInterval(timerobject)nó không hoạt động.

Tôi phải lấy id trước và gọi tới ClearInterval

clearInterval(timerobject._id)

Tôi đã đấu tranh nhiều giờ với điều này. hi vọng điêu nay co ich.


5

Lưu ý bên lề - nếu bạn muốn sử dụng các chức năng riêng biệt để đặt và xóa khoảng thời gian, biến khoảng thời gian phải có thể truy cập được cho tất cả chúng, trong phạm vi 'toàn cầu tương đối' hoặc 'một cấp độ tăng':

var interval = null;    

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

function stopStuff() {
    clearInterval(interval);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.