定时任务执行器

function delay(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}
const dateFormat = function (date, fmt) {
    if (!date) return ''
    date = new Date(date)
    let ret
    const opt = {
        "y+": date.getFullYear().toString(),        // 年
        "Y+": date.getFullYear().toString(),        // 年
        "M+": (date.getMonth() + 1).toString(),     // 月
        "d+": date.getDate().toString(),            // 日
        "D+": date.getDate().toString(),            // 日
        "H+": date.getHours().toString(),           // 时
        "h+": date.getHours().toString(),           // 时
        "m+": date.getMinutes().toString(),         // 分
        "S+": date.getSeconds().toString(),         // 秒
        "s+": date.getSeconds().toString(),         // 秒
        "f+": date.getMilliseconds().toString()     // 毫秒
    }
    for (let k in opt) {
        ret = new RegExp("(" + k + ")").exec(fmt)
        if (ret) {
            fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
        }
    }
    return fmt
}

Date.prototype.format = function (args) {
    return dateFormat(this, args)
}
async function init(taskList){
    taskList.forEach(task=>{
        task.startTime=new Date(task.startTime).getTime()
        task.endTime=new Date(task.endTime).getTime()
        while(task.startTime<new Date().getTime()){
            task.startTime=task.startTime+task.duration
        }
    })
    // 按照 startTime 从小到大排序
    taskList.sort((a, b) => {
        return a.startTime - b.startTime
    });

    while(taskList.length>0){
        let curTime=new Date().getTime()
        const task=taskList.shift()
        if(curTime>task.endTime){
            console.log('任务过期'+task.name)
            continue
        }
        const wTime=task.startTime - curTime

        if(wTime>0){
            console.log(new Date(task.startTime).format('yyyy-MM-dd HH:mm:ss'),'下个任务:'+task.name)
            await delay(wTime);
        }

        curTime=new Date().getTime()
        if(curTime>=task.startTime){
            while(task.startTime<curTime){
                task.startTime=task.startTime+task.duration
            }
            if(task.startTime<task.endTime){
                taskList.push(task)
                // 按照 startTime 从小到大排序
                taskList.sort((a, b) => {
                    return a.startTime - b.startTime
                });
            }
            console.log('执行'+task.name,new Date().format('yyyy-MM-dd HH:mm:ss'))
            await task.taskFunction()
            console.log('完成'+task.name,new Date().format('yyyy-MM-dd HH:mm:ss'))

        }

    }
    console.log('all任务完成')
}

const {taskDay,taskHour} = require('../adQuality.jsapi/task/allTask-test')

let taskList=[
    {
        name: '每天5点执行抓取日志',
        startTime: new Date().format('yyyy-MM-dd 06:00:00'),
        duration: 24*60*60*1000,
        endTime: new Date().format('yyyy-MM-13 00:00:00'),
        async taskFunction(){
            await taskDay()
        }
    },
    {
        name: '每个小时执行一次',
        startTime: new Date().format('yyyy-MM-dd 06:00:00'),
        duration: 60*60*1000,
        endTime: new Date().format('yyyy-MM-13 00:00:00'),
        async taskFunction(){
            await taskHour()
        }
    }
]
init(taskList)

  

posted @ 2025-05-09 16:45  无工时代  阅读(10)  评论(0)    收藏  举报