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)