import { v4 as uuid } from 'uuid'
class IntervalTimer {
constructor (params) {
this.timerList = []
this.options = Object.assign({}, {
delay: 1000
}, params)
}
/**
* 添加定时器
* @param {*} callback 回调执行函数
* @param {*} delay 延迟时间
* @param {*} immediate 是否立即执行
* @returns
*/
addTimer (callback, delay = this.options.delay, immediate = false) {
let timerId = uuid()
let timer = {
id: timerId,
callback,
delay,
count: 0, // 执行次数
timestamp: new Date().getTime()
}
this.timerList.push(timer)
if (immediate) {
this._execute(timer)
} else {
this._runTimer(timer)
}
return timerId
}
_runTimer (timer) {
timer.target = setTimeout(this._execute.bind(this), timer.delay, timer)
}
_execute (task) {
task.count++
let current = new Date().getTime()
let duration = current - task.timestamp
task.timestamp = current
task.callback(task.count, duration) // 回调参数:当前执行次数,实际间隔时长(毫秒)
// clearTimeout(task.target)
this._runTimer(task)
}
clearTimer (timerId) {
const taskIndex = this.timerList.findIndex(item => item.id === timerId)
if (taskIndex !== -1) {
// 由于删除该计时器时可能存在该计时器已经入栈,所以要先清除掉,防止添加的时候重复计时
clearTimeout(this.timerList[taskIndex].target)
let count = this.timerList[taskIndex].count
this.timerList.splice(taskIndex, 1)
return count
}
}
dispose () {
let list = this.timerList.map(item => item.id)
list.forEach(item => this.clearTimer(item))
}
}
export default new IntervalTimer()
setInterval和setTimeout 的主要区别,使用setTimeout 代替setInterval
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- setTimeout(fn, time),超时调用,在时间大于等于 time 时调用; setInterval(f...
- 箭头函数是匿名函数,ES5匿名函数的语法糖;但又增加了ES5所没有的一些优点,接下来我们一起来看一看箭头函数 ES...
- @protocol是我们协议的标识,协议中的方法有两种,一种是必须实现的,另一种是可选择实现的。这是一种间接扩充功...
- 区别: setTimeOut(表达式,时间)=》是指延迟指定时间后才调用函数,调用次数仅一次,但可以根据条件反复调...