การหมดเวลานั้นง่ายพอที่จะหาทางแก้ไขได้ แต่ช่วงเวลานั้นค่อนข้างยากกว่าเล็กน้อย
ฉันคิดสองคลาสต่อไปนี้เพื่อแก้ปัญหานี้:
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);}
}
สิ่งเหล่านี้สามารถดำเนินการได้ดังนี้:
var pt_hey = new PauseableTimeout(function(){
alert("hello");
}, 2000);
window.setTimeout(function(){
pt_hey.pause();
}, 1000);
window.setTimeout("pt_hey.start()", 2000);
ตัวอย่างนี้จะตั้งค่าการหมดเวลาที่หยุดชั่วคราวได้ (pt_hey) ซึ่งกำหนดให้แจ้งเตือน "เฮ้" หลังจากผ่านไปสองวินาที การหมดเวลาอื่นจะหยุด pt_hey ชั่วคราวหลังจากผ่านไปหนึ่งวินาที การหมดเวลาครั้งที่สามจะดำเนินการต่อ pt_hey หลังจากผ่านไปสองวินาที pt_hey ทำงานเป็นเวลาหนึ่งวินาทีหยุดชั่วคราวหนึ่งวินาทีจากนั้นเริ่มทำงานต่อ pt_hey ทริกเกอร์หลังจากสามวินาที
ตอนนี้สำหรับช่วงเวลาที่ยากลำบาก
var pi_hey = new PauseableInterval(function(){
console.log("hello world");
}, 2000);
window.setTimeout("pi_hey.pause()", 5000);
window.setTimeout("pi_hey.resume()", 6000);
ตัวอย่างนี้กำหนดช่วงเวลาที่หยุดชั่วคราวได้ (pi_hey) เพื่อเขียน "hello world" ในคอนโซลทุกๆสองวินาที การหมดเวลาจะหยุด pi_hey ชั่วคราวหลังจากผ่านไปห้าวินาที การหมดเวลาอื่นจะดำเนินการต่อจาก pi_hey หลังจากหกวินาที ดังนั้น pi_hey จะทริกเกอร์สองครั้งรันเป็นเวลาหนึ่งวินาทีหยุดชั่วคราวหนึ่งวินาทีทำงานหนึ่งวินาทีจากนั้นทริกเกอร์ต่อทุกๆ 2 วินาที
ฟังก์ชั่นอื่น ๆ
clearTimeout ()และclearInterval ()
pt_hey.clearTimeout();
และpi_hey.clearInterval();
เป็นวิธีง่ายๆในการล้างระยะหมดเวลาและช่วงเวลา
getTimeLeft ()
pt_hey.getTimeLeft();
และpi_hey.getTimeLeft();
จะส่งคืนจำนวนมิลลิวินาทีจนกว่าจะมีการกำหนดให้ทริกเกอร์ถัดไปเกิดขึ้น