lg_frontend/utils/timer.js

82 lines
1.9 KiB
JavaScript
Raw Permalink Normal View History

2024-02-19 16:02:13 +00:00
/*
开发环境不开启定时器
*/
const isStartTimer = process.env.NODE_ENV !== 'development'
/**
* @function 定时器
* @param fn { function } 执行过程
* @param duration { timestamp } 间隔时间
* @param immediate { boolean } 是否立即执行
* @returns {{stop(): void, restart: restart}}
*/
export default function timer(fn, duration = 5 * 1000, immediate = true) {
// 执行队列
let processes = []
let _args = []
// 定义定时器
let timer = null
let _duration = duration
// 过程支持list和单一函数
if (Array.isArray(fn)) {
processes.push.apply(processes, fn)
} else {
processes.push(fn)
}
/**
* @function 过程执行器
* @param processes { Array<function> | function }
* @param args { any }
* @returns {Promise<void>}
*/
const exec = async (processes, ...args) => {
_args = args
try {
if (timer) {
clearTimeout(timer)
timer = null
}
for (let process of processes) {
if (typeof process === 'function') {
await process(..._args)
}
}
} catch (e) {
console.error('TimerError:', e)
} finally {
if (!isStartTimer) return false
timer = setTimeout(() => {
exec(processes, ..._args)
}, _duration)
}
}
if (immediate) {
exec(processes)
}
return {
stop () {
if (timer) {
clearTimeout(timer)
timer = null
processes = null
_args = null
}
},
clearParams () {
_args = []
},
/**
* 定时器重启
* @param args { { params: Array<any>, duration: number } } 回调的参数
*/
restart: function (options = {}) {
const { params = [], duration } = options
// 不能用全等对象中的undefined 与 undefined 不是全等
if (duration != undefined || duration != null) {
_duration = duration
}
exec(processes, ...(params || []))
}
}
}