diff options
| author | ruki <waruqi@gmail.com> | 2018-11-08 00:38:48 +0800 |
|---|---|---|
| committer | ruki <waruqi@gmail.com> | 2018-11-07 21:53:09 +0800 |
| commit | 26105034da4fcce7ac883c899d781f016559310d (patch) | |
| tree | c459a5dc4e3aa0972d9919033ece511ce76dd129 /node_modules/nanoscheduler/index.js | |
| parent | 2c77f00f1a7ecb6c8192f9c16d3b2001b254a107 (diff) | |
| download | xmake-docs-26105034da4fcce7ac883c899d781f016559310d.tar.gz xmake-docs-26105034da4fcce7ac883c899d781f016559310d.zip | |
switch to vuepress
Diffstat (limited to 'node_modules/nanoscheduler/index.js')
| -rw-r--r-- | node_modules/nanoscheduler/index.js | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/node_modules/nanoscheduler/index.js b/node_modules/nanoscheduler/index.js new file mode 100644 index 00000000..c9dc7535 --- /dev/null +++ b/node_modules/nanoscheduler/index.js @@ -0,0 +1,55 @@ +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 |
