Node动态定时任务

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)






运行结果如下:

发布了55 篇原创文章 · 获赞 17 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/XuHang666/article/details/90694753