export default class RAF { constructor () { this.init() } init () { this._timerIdMap = { timeout: {}, interval: {} } } run (type = 'interval', cb, interval = 16.7) { const now = Date.now let stime = now() let etime = stime // 创建Symbol类型作为key值,保证返回值的唯一性,用于清除定时器使用 const timerSymbol = Symbol('timerSymbol') const loop = () => { this.setIdMap(timerSymbol, type, loop) etime = now() if (etime - stime >= interval) { if (type === 'interval') { stime = now() etime = stime } cb() type === 'timeout' && this.clearTimeout(timerSymbol) } } this.setIdMap(timerSymbol, type, loop) return timerSymbol // 返回Symbol保证每次调用setTimeout/setInterval返回值的唯一性 } setIdMap (timerSymbol, type, loop) { this._timerIdMap[type][timerSymbol] = requestAnimationFrame(loop) } setTimeout (cb, interval) { // 实现setTimeout 功能 return this.run('timeout', cb, interval) } clearTimeout (timer) { cancelAnimationFrame(this._timerIdMap.timeout[timer]) } setInterval (cb, interval) { // 实现setInterval功能 return this.run('interval', cb, interval) } clearInterval (timer) { cancelAnimationFrame(this._timerIdMap.interval[timer]) }}