Node使用node-schedule库实现动态添加和移除任务
1. 构造一个类,定义增加和移除 task任务方法
2. 使用setInterval模拟添加和移除task任务
3. node-schedule 规则如下
* * * * * * ┬ ┬ ┬ ┬ ┬ ┬ │ │ │ │ │ │ │ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun) │ │ │ │ └───── month (1 - 12) │ │ │ └────────── day of month (1 - 31) │ │ └─────────────── hour (0 - 23) │ └──────────────────── minute (0 - 59) └───────────────────────── second (0 - 59, OPTIONAL)
let schedule = require('node-schedule');
const _1day = '0 0 0 * * *';
const _1second = '*/1 * * * * *'
let i = 0;
/*schedule.scheduleJob(_1second,function () {
console.log(i++)
})*/
let taskIds = [];
class Task {
constructor(){
}
addTask(time,name,i){
let id = schedule.scheduleJob(time,function () {
console.log(name+':'+i)
})
taskIds.push(id)
}
removeTask(i){
rv(i)
}
}
function rv(i) {
if (taskIds.length==0){
console.log('all task has be cleared');
return;
}
if (i<=taskIds.length-1){
taskIds[i].cancel();
taskIds.splice(i,1)
} else {
i--;
rv(i);
}
}
function getRanNum(){
var result = [];
for(var i=0;i<4;i++){
var ranNum = Math.ceil(Math.random() * 25); //生成一个0到25的数字
//大写字母'A'的ASCII是65,A~Z的ASCII码就是65 + 0~25;然后调用String.fromCharCode()传入ASCII值返回相应的字符并push进数组里
result.push(String.fromCharCode(65+ranNum));
}
return result.join('');
}
let t = new Task();
let ti = 0;
setInterval(function () {
if (ti==5){
console.log('has be returned')
return;
}else {
t.addTask(_1second,getRanNum(),ti++)
}
},1000)
setTimeout(function () {
setInterval(function () {
let id = Math.floor(Math.random()*taskIds.length)
t.removeTask(id)
},1000)
},5000)
运行结果如下: