82 lines
1.9 KiB
JavaScript
82 lines
1.9 KiB
JavaScript
|
|
/*
|
|||
|
|
开发环境不开启定时器
|
|||
|
|
*/
|
|||
|
|
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 || []))
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|