TypeScript
/***
* callback 定时任务回调函数,
* time 任务执行的间隔时间,
* config.accurate 是否是精准的定时任务,如果是,会自动修正定时器偏差。
*/
export default function (
callback: () => void,
time: number,
config?: {
accurate: boolean // 是否是精准的定时任务,如果是,会自动修正定时器偏差。
}
) {
let task: any = null
const record = {
startTime: 0,
runTime: 0,
offsetTime: 0
}
const run = () => {
if (config?.accurate) {
record.startTime = new Date().getTime()
}
task = setTimeout(() => {
if (config?.accurate) {
record.runTime = new Date().getTime()
record.offsetTime = time - (record.runTime - record.startTime)
} else {
record.offsetTime = 0
}
// 必须先run,再执行callback,防止在callback中调用clearTask方法
run()
callback()
}, time + record.offsetTime)
}
/**
* 清除定时任务
*/
const clearTask = () => {
clearTimeout(task)
task = null
}
/**
* 启动定时任务
* @param immediate 是否立即运行
*/
const startTask = (immediate?: boolean) => {
if (immediate) {
callback()
}
clearTask()
run();
}
return {
clearTask,
startTask
}
}
使用、控制都很方便:
TypeScript
// 初始化
const { clearTask, startTask } = useInterval(() => {
// do something....
}, 1000)
// 启动
startTask()
// 清除
clearTask()
//重新启动
clearTask()
startTask()