UNPKG

@pirxpilot/nanoscheduler

Version:

Schedule work to be completed when the browser is idle.

42 lines (32 loc) 981 B
import assert from '@pirxpilot/nanoassert'; export default createScheduler; function createScheduler() { if (!globalThis._nanoScheduler) globalThis._nanoScheduler = scheduler(); return globalThis._nanoScheduler; } const method = typeof requestIdleCallback === 'function' ? requestIdleCallback : fallbackRequestIdleCallback; function scheduler() { let scheduled = false; const queue = []; return { push }; function push(cb) { assert.equal(typeof cb, 'function', 'nanoscheduler.push: cb should be type function'); queue.push(cb); schedule(); } function schedule() { if (scheduled) return; scheduled = true; method(idleDeadline => { while (queue.length && idleDeadline.timeRemaining() > 0) { const cb = queue.shift(); cb(idleDeadline); } scheduled = false; if (queue.length) schedule(); }); } } function fallbackRequestIdleCallback(cb) { setTimeout(cb, 0, { timeRemaining: () => 1 }); }