代码拉取完成,页面将自动刷新
同步操作将从 lianzt/job-timer 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
/**
* 定时器
*/
const logger = require('./util').getLogger('timer')
const tasks = new Map()
/**
* @name 定时器名
* @begin 开始时间
* @cycle 周期,单位:ms
* @begin 开始日期
*/
const addTask = ({name, begin, cycle, fun, args}) => {
if (tasks.has(name)) {
throw new Error(`任务 ${name} 已经存在!`)
}
logger.info(`添加定时任务 name=${name}, begin=${begin}, cycle=${cycle}`)
if (cycle && fun){
tasks.set(name, {
begin: begin ? begin.getTime() : new Date().getTime() + 1000,
cycle, fun, args
});
startTask(name)
}
}
const removeTask = (name) => {
if (tasks.has(name)) {
logger.debug(`删除任务 ${name}`)
stopTask(name)
tasks.delete(name)
}
}
const stopTask = (name) => {
if (tasks.has(name)) {
let t = tasks.get(name)
logger.debug(`停止任务 ${name} , is run ${t.isRun}`)
if (t.isRun) {
clearInterval(t.id)
} else {
clearTimeout(t.id)
}
t.id = undefined
}
}
const startTask = (name) => {
// return
if (!tasks.has(name)) {
throw new Error(`${name} 定时任务不存在`)
}
let t = tasks.get(name)
if (!t.id) {
logger.debug(`开始启动任务 ${name}`)
let now = new Date().getTime()
if (t.begin < now) {
t.begin += Math.ceil((now - t.begin) / t.cycle) * t.cycle
}
t.id = setTimeout((_t) => {
//设置循环
_t.id = setInterval(_t.fun, _t.cycle, _t.args)
_t.isRun = true;
logger.debug(`开始运行任务 ${name}`)
_t.fun(_t.args) //运行一次
}, t.begin - now, t)
t.isRun = false
}
}
module.exports = {
addTask, stopTask, startTask, removeTask
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。