UNPKG

rx-winjs

Version:

Library for composing asynchronous and event-based operations in JavaScript extending the Windows WinJS library

80 lines (68 loc) 3.19 kB
// Get the right animation frame method var requestAnimFrame, cancelAnimFrame; if (window.requestAnimationFrame) { requestAnimFrame = window.requestAnimationFrame; cancelAnimFrame = window.cancelAnimationFrame; } else if (window.mozRequestAnimationFrame) { requestAnimFrame = window.mozRequestAnimationFrame; cancelAnimFrame = window.mozCancelAnimationFrame; } else if (window.webkitRequestAnimationFrame) { requestAnimFrame = window.webkitRequestAnimationFrame; cancelAnimFrame = window.webkitCancelAnimationFrame; } else if (window.msRequestAnimationFrame) { requestAnimFrame = window.msRequestAnimationFrame; cancelAnimFrame = window.msCancelAnimationFrame; } else if (window.oRequestAnimationFrame) { requestAnimFrame = window.oRequestAnimationFrame; cancelAnimFrame = window.oCancelAnimationFrame; } else { requestAnimFrame = function(cb) { window.setTimeout(cb, 1000 / 60); }; cancelAnimFrame = window.clearTimeout; } /** * Gets a scheduler that schedules schedules work on the requestAnimationFrame for immediate actions. * * @memberOf Scheduler */ Scheduler.requestAnimationFrame = (function () { var defaultNow = (function () { return !!Date.now ? Date.now : function () { return +new Date; }; }()); function scheduleNow(state, action) { var scheduler = this, disposable = new SingleAssignmentDisposable(); var id = requestAnimFrame(function () { if (!disposable.isDisposed) { disposable.setDisposable(action(scheduler, state)); } }); return new CompositeDisposable(disposable, disposableCreate(function () { cancelAnimFrame(id); })); } function scheduleRelative(state, dueTime, action) { var scheduler = this, dt = Scheduler.normalize(dueTime); if (dt === 0) { return scheduler.scheduleWithState(state, action); } var disposable = new SingleAssignmentDisposable(), id; var scheduleFunc = function () { if (id) { cancelAnimFrame(id); } if (dt - scheduler.now() <= 0) { if (!disposable.isDisposed) { disposable.setDisposable(action(scheduler, state)); } } else { id = requestAnimFrame(scheduleFunc); } }; id = requestAnimFrame(scheduleFunc); return new CompositeDisposable(disposable, disposableCreate(function () { cancelAnimFrame(id); })); } function scheduleAbsolute(state, dueTime, action) { return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action); } return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute); }());