var Class = require('../utils/Class'); var NOOP = require('../utils/NOOP'); var RequestAnimationFrame = new Class({ initialize: function RequestAnimationFrame(){ this.isRunning = false ; this.callback = NOOP; this.tick = 0; this.isSetTimeOut = false ; this.timeOutID = null ; this.lastTime = 0; var _this = this; this.step = function step(timestamp){ _this.lastTime = _this.tick; _this.tick = timestamp; _this.callback(timestamp); _this.timeOutID = window.requestAnimationFrame(step); } ; this.stepTimeout = function stepTimeout(){ var d = Date.now(); var delay = Math.max(16 + _this.lastTime - d, 0); _this.lastTime = _this.tick; _this.tick = d; _this.callback(d); _this.timeOutID = _AN_Call_settimeout('setTimeout', window, stepTimeout, delay); } ; } , start: function (callback, forceSetTimeOut){ if (this.isRunning) { return ; } this.callback = callback; this.isSetTimeOut = forceSetTimeOut; this.isRunning = true ; this.timeOutID = (forceSetTimeOut)? _AN_Call_settimeout('setTimeout', window, this.stepTimeout, 0): window.requestAnimationFrame(this.step); } , stop: function (){ this.isRunning = false ; if (this.isSetTimeOut) { clearTimeout(this.timeOutID); } else { window.cancelAnimationFrame(this.timeOutID); } } , destroy: function (){ this.stop(); this.callback = NOOP; } } ); module.exports = RequestAnimationFrame;