47 lines
916 B
JavaScript
47 lines
916 B
JavaScript
// requestIdleCallback sortof-polyfill
|
|
if (!self.requestIdleCallback) {
|
|
const IDLE_TIMEOUT = 10;
|
|
self.requestIdleCallback = cb => {
|
|
let start = Date.now();
|
|
return setTimeout(
|
|
() =>
|
|
cb({
|
|
timeRemaining: () => Math.max(0, IDLE_TIMEOUT - (Date.now() - start))
|
|
}),
|
|
1
|
|
);
|
|
};
|
|
self.requestIdleCallback = clearTimeout;
|
|
}
|
|
|
|
export function backgroundTask(fn, timeout = undefined) {
|
|
let id = null;
|
|
const params = [];
|
|
|
|
async function runTask({ didTimeout }) {
|
|
if (didTimeout) {
|
|
id = requestIdleCallback(runTask);
|
|
return;
|
|
}
|
|
const start = Date.now();
|
|
const p = params.shift();
|
|
await fn(...p);
|
|
if (params.length) {
|
|
id = requestIdleCallback(runTask, { timeout });
|
|
} else {
|
|
id = null;
|
|
}
|
|
}
|
|
|
|
const wrapper = (...args) => {
|
|
params.push(args);
|
|
if (id !== null) {
|
|
return false;
|
|
}
|
|
id = requestIdleCallback(runTask, { timeout });
|
|
return true;
|
|
};
|
|
|
|
return wrapper;
|
|
}
|