Thời gian chờ đủ dễ dàng để tìm ra giải pháp, nhưng Khoảng thời gian thì phức tạp hơn một chút.
Tôi đã nghĩ ra hai lớp sau để giải quyết vấn đề này:
function PauseableTimeout(func, delay){
this.func = func;
var _now = new Date().getTime();
this.triggerTime = _now + delay;
this.t = window.setTimeout(this.func,delay);
this.paused_timeLeft = 0;
this.getTimeLeft = function(){
var now = new Date();
return this.triggerTime - now;
}
this.pause = function(){
this.paused_timeLeft = this.getTimeLeft();
window.clearTimeout(this.t);
this.t = null;
}
this.resume = function(){
if (this.t == null){
this.t = window.setTimeout(this.func, this.paused_timeLeft);
}
}
this.clearTimeout = function(){ window.clearTimeout(this.t);}
}
function PauseableInterval(func, delay){
this.func = func;
this.delay = delay;
this.triggerSetAt = new Date().getTime();
this.triggerTime = this.triggerSetAt + this.delay;
this.i = window.setInterval(this.func, this.delay);
this.t_restart = null;
this.paused_timeLeft = 0;
this.getTimeLeft = function(){
var now = new Date();
return this.delay - ((now - this.triggerSetAt) % this.delay);
}
this.pause = function(){
this.paused_timeLeft = this.getTimeLeft();
window.clearInterval(this.i);
this.i = null;
}
this.restart = function(sender){
sender.i = window.setInterval(sender.func, sender.delay);
}
this.resume = function(){
if (this.i == null){
this.i = window.setTimeout(this.restart, this.paused_timeLeft, this);
}
}
this.clearInterval = function(){ window.clearInterval(this.i);}
}
Những điều này có thể được thực hiện như sau:
var pt_hey = new PauseableTimeout(function(){
alert("hello");
}, 2000);
window.setTimeout(function(){
pt_hey.pause();
}, 1000);
window.setTimeout("pt_hey.start()", 2000);
Ví dụ này sẽ đặt Thời gian chờ có thể tạm dừng (pt_hey) được lên lịch để cảnh báo, "hey" sau hai giây. Thời gian chờ khác tạm dừng pt_hey sau một giây. Thời gian chờ thứ ba tiếp tục pt_hey sau hai giây. pt_hey chạy trong một giây, tạm dừng trong một giây, sau đó tiếp tục chạy. pt_hey sẽ kích hoạt sau ba giây.
Bây giờ cho những khoảng thời gian phức tạp hơn
var pi_hey = new PauseableInterval(function(){
console.log("hello world");
}, 2000);
window.setTimeout("pi_hey.pause()", 5000);
window.setTimeout("pi_hey.resume()", 6000);
Ví dụ này đặt Khoảng thời gian có thể tạm dừng (pi_hey) để viết "hello world" trong bảng điều khiển cứ hai giây một lần. Hết thời gian tạm dừng pi_hey sau năm giây. Một thời gian chờ khác sẽ tiếp tục pi_hey sau sáu giây. Vì vậy, pi_hey sẽ kích hoạt hai lần, chạy trong một giây, tạm dừng trong một giây, chạy trong một giây và sau đó tiếp tục kích hoạt sau mỗi 2 giây.
CAC CHƯC NĂNG KHAC
clearTimeout () và clearInterval ()
pt_hey.clearTimeout();
và pi_hey.clearInterval();
phục vụ như một cách dễ dàng để xóa thời gian chờ và khoảng thời gian.
getTimeLeft ()
pt_hey.getTimeLeft();
và pi_hey.getTimeLeft();
sẽ trả về bao nhiêu mili giây cho đến khi kích hoạt tiếp theo được lên lịch để xảy ra.