Làm cách nào để đặt lại bộ hẹn giờ setInterval?


81

Làm cách nào để đặt lại setIntervalbộ hẹn giờ về 0?

var myTimer = setInterval(function() {
  console.log('idle');
}, 4000);

Tôi đã thử clearInterval(myTimer)nhưng điều đó hoàn toàn dừng lại khoảng thời gian. Tôi muốn nó khởi động lại từ 0.

Câu trả lời:


171

Nếu "khởi động lại", nghĩa là bạn bắt đầu khoảng thời gian 4 giây mới tại thời điểm này, thì bạn phải dừng và khởi động lại bộ đếm thời gian.

function myFn() {console.log('idle');}

var myTimer = setInterval(myFn, 4000);

// Then, later at some future time, 
// to restart a new 4 second interval starting at this exact moment in time
clearInterval(myTimer);
myTimer = setInterval(myFn, 4000);

Bạn cũng có thể sử dụng một đối tượng hẹn giờ nhỏ cung cấp tính năng đặt lại:

function Timer(fn, t) {
    var timerObj = setInterval(fn, t);

    this.stop = function() {
        if (timerObj) {
            clearInterval(timerObj);
            timerObj = null;
        }
        return this;
    }

    // start timer using current settings (if it's not already running)
    this.start = function() {
        if (!timerObj) {
            this.stop();
            timerObj = setInterval(fn, t);
        }
        return this;
    }

    // start with new or original interval, stop current interval
    this.reset = function(newT = t) {
        t = newT;
        return this.stop().start();
    }
}

Sử dụng:

var timer = new Timer(function() {
    // your function here
}, 5000);


// switch interval to 10 seconds
timer.reset(10000);

// stop the timer
timer.stop();

// start the timer
timer.start();

Bản demo làm việc: https://jsfiddle.net/jfriend00/t17vz506/


Đối tượng đẹp. Tôi luôn cảm thấy vui khi thấy ai đó sử dụng OOP trong javascript! Cảm ơn bạn!
Fortin

12

Khi bạn xóa khoảng thời gian bằng cách sử dụng clearIntervalbạn có thể setIntervalmột lần nữa. Và để tránh lặp lại lệnh gọi lại, hãy ngoại hóa nó như một hàm riêng biệt:

var ticker = function() {
    console.log('idle');
};

sau đó:

var myTimer = window.setInterval(ticker, 4000);

sau đó khi bạn quyết định khởi động lại:

window.clearInterval(myTimer);
myTimer = window.setInterval(ticker, 4000);

nhưng bằng cách nào? clearInterval (myTimer) và sau đó setInterval (myTimer, 4000) không hoạt động :(
Rik de Vos

@RikdeVos, tại sao nó không hoạt động? Ngoài ra nó không phải setInterval(myTimer, 4000), nó nên được setInterval(ticker, 4000);.
Darin Dimitrov
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.