|
@@ -5,9 +5,12 @@ class t {
|
|
|
isPause = false;
|
|
|
reFreshTime = 10;// 更新数据毫秒
|
|
|
lastTime = 0;// 上一次的毫秒数
|
|
|
- constructor(){
|
|
|
+ countdownTime = null; // 倒计时总时间
|
|
|
+ scheduledTasks = []; // 计划的任务
|
|
|
+ constructor(countdownTime){
|
|
|
this.ms = 0;
|
|
|
this.timer = null;
|
|
|
+ this.countdownTime = countdownTime;
|
|
|
}
|
|
|
init(){
|
|
|
this.ms = 0;
|
|
@@ -43,6 +46,43 @@ class t {
|
|
|
this.timer = null;
|
|
|
this.isPause = false;
|
|
|
}
|
|
|
+ addCountdownTask(duration, callback) {
|
|
|
+ const endTime = new Date().getTime() + duration;
|
|
|
+ this.countdownTasks.push({ endTime, callback });
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ 添加计划任务
|
|
|
+ */
|
|
|
+ addScheduledTask(hour, minute, second, callback, skipDays = 0) {
|
|
|
+ const newTask = { hour, minute, second, callback, skipDays };
|
|
|
+ const index = this.scheduledTasks.findIndex(
|
|
|
+ (task) =>
|
|
|
+ task.hour > newTask.hour ||
|
|
|
+ (task.hour === newTask.hour && task.minute > newTask.minute) ||
|
|
|
+ (task.hour === newTask.hour &&
|
|
|
+ task.minute === newTask.minute &&
|
|
|
+ task.second > newTask.second)
|
|
|
+ );
|
|
|
+ if (index === -1) {
|
|
|
+ this.scheduledTasks.push(newTask);
|
|
|
+ } else {
|
|
|
+ this.scheduledTasks.splice(index, 0, newTask);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 修改计划任务的时间
|
|
|
+ updateScheduledTask(index, hour, minute, second) {
|
|
|
+ if (this.scheduledTasks[index]) {
|
|
|
+ this.scheduledTasks[index].hour = hour;
|
|
|
+ this.scheduledTasks[index].minute = minute;
|
|
|
+ this.scheduledTasks[index].second = second;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 跳过明天
|
|
|
+ skipTomorrow(index) {
|
|
|
+ if (this.scheduledTasks[index]) {
|
|
|
+ this.scheduledTasks[index].skipDays = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
tick(){
|
|
|
let latencyTime = this.reFreshTime;
|
|
|
// 获取当前时间,以及上一次时间
|
|
@@ -52,10 +92,8 @@ class t {
|
|
|
// 两次执行间的时间差
|
|
|
let timeGap = nowTimeStamp - lastTime;
|
|
|
if((timeGap - this.reFreshTime) < 0){
|
|
|
- // 时间差小于10秒,需要将多跑的时间补齐回去
|
|
|
latencyTime = this.reFreshTime + (timeGap - this.reFreshTime) ;
|
|
|
}else {
|
|
|
- // 时间差大于10秒,任务执行超时.减去多损耗的时间
|
|
|
latencyTime = this.reFreshTime - (timeGap - this.reFreshTime) ;
|
|
|
latencyTime = Math.max(latencyTime,0);
|
|
|
}
|
|
@@ -65,6 +103,34 @@ class t {
|
|
|
}
|
|
|
this.ms += timeGap;
|
|
|
this.lastTime = nowTimeStamp;
|
|
|
+ // 检查计划任务
|
|
|
+ const currentTime = new Date();
|
|
|
+ this.countdownTasks = this.countdownTasks.filter((task) => {
|
|
|
+ if (currentTime >= task.endTime) {
|
|
|
+ task.callback();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ });
|
|
|
+ this.scheduledTasks.forEach((task, index) => {
|
|
|
+ if (
|
|
|
+ currentTime.getHours() === task.hour &&
|
|
|
+ currentTime.getMinutes() === task.minute &&
|
|
|
+ currentTime.getSeconds() === task.second
|
|
|
+ ) {
|
|
|
+ if (task.skipDays > 0) {
|
|
|
+ task.skipDays--; // 减少跳过的天数
|
|
|
+ } else {
|
|
|
+ // 1 分钟提醒
|
|
|
+ if (currentTime.getMinutes() === task.minute - 1) {
|
|
|
+ console.log(`任务 ${index} 将在 1 分钟后执行`);
|
|
|
+ }
|
|
|
+ task.callback();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
// 触发hook
|
|
|
this._reFreshHook(this.ms);
|
|
|
this.timer = setTimeout(()=>{
|