UNPKG

choo-shortcache

Version:

choo nanocomponent cache shortcut

56 lines (46 loc) 1.32 kB
var assert = require('assert') var hasWindow = typeof window !== 'undefined' function createScheduler () { var scheduler if (hasWindow) { if (!window._nanoScheduler) window._nanoScheduler = new NanoScheduler(true) scheduler = window._nanoScheduler } else { scheduler = new NanoScheduler() } return scheduler } function NanoScheduler (hasWindow) { this.hasWindow = hasWindow this.hasIdle = this.hasWindow && window.requestIdleCallback this.method = this.hasIdle ? window.requestIdleCallback.bind(window) : this.setTimeout this.scheduled = false this.queue = [] } NanoScheduler.prototype.push = function (cb) { assert.equal(typeof cb, 'function', 'nanoscheduler.push: cb should be type function') this.queue.push(cb) this.schedule() } NanoScheduler.prototype.schedule = function () { if (this.scheduled) return this.scheduled = true var self = this this.method(function (idleDeadline) { var cb while (self.queue.length && idleDeadline.timeRemaining() > 0) { cb = self.queue.shift() cb(idleDeadline) } self.scheduled = false if (self.queue.length) self.schedule() }) } NanoScheduler.prototype.setTimeout = function (cb) { setTimeout(cb, 0, { timeRemaining: function () { return 1 } }) } module.exports = createScheduler