lg_frontend/utils/timer.js

82 lines
1.9 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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