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 || []))
 | 
						||
    }
 | 
						||
  }
 | 
						||
}
 |