👽️ requestIdleCallback add the polyfill of MessageChannel (#2475)
This commit is contained in:
parent
f17b416722
commit
e0e6763668
|
|
@ -16,20 +16,39 @@ declare global {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// RIC and shim for browsers setTimeout() without it
|
function idleCall(cb: IdleRequestCallback, start: number) {
|
||||||
const requestIdleCallback =
|
cb({
|
||||||
window.requestIdleCallback ||
|
didTimeout: false,
|
||||||
function requestIdleCallback(cb: CallableFunction) {
|
timeRemaining() {
|
||||||
const start = Date.now();
|
return Math.max(0, 50 - (Date.now() - start));
|
||||||
return setTimeout(() => {
|
},
|
||||||
cb({
|
});
|
||||||
didTimeout: false,
|
}
|
||||||
timeRemaining() {
|
|
||||||
return Math.max(0, 50 - (Date.now() - start));
|
// RIC and shim for browsers setTimeout() without it idle
|
||||||
},
|
let requestIdleCallback: (cb: IdleRequestCallback) => any;
|
||||||
});
|
if (typeof window.requestIdleCallback !== 'undefined') {
|
||||||
}, 1);
|
requestIdleCallback = window.requestIdleCallback;
|
||||||
|
} else if (typeof window.MessageChannel !== 'undefined') {
|
||||||
|
// The first recommendation is to use MessageChannel because
|
||||||
|
// it does not have the 4ms delay of setTimeout
|
||||||
|
const channel = new MessageChannel();
|
||||||
|
const port = channel.port2;
|
||||||
|
const tasks: IdleRequestCallback[] = [];
|
||||||
|
channel.port1.onmessage = ({ data }) => {
|
||||||
|
const task = tasks.shift();
|
||||||
|
if (!task) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
idleCall(task, data.start);
|
||||||
};
|
};
|
||||||
|
requestIdleCallback = function(cb: IdleRequestCallback) {
|
||||||
|
tasks.push(cb);
|
||||||
|
port.postMessage({ start: Date.now() });
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
requestIdleCallback = (cb: IdleRequestCallback) => setTimeout(idleCall, 0, cb, Date.now());
|
||||||
|
}
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
interface Navigator {
|
interface Navigator {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user