[Perf] Batch requestIdleCallback calls
This commit is contained in:
parent
cfe7446d93
commit
496c6c697d
@ -105,14 +105,14 @@ export function dispatchHeavyAnimationEvent(duration = AUTO_END_TIMEOUT) {
|
|||||||
return onEnd;
|
return onEnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function onFullyIdle(cb: NoneToVoidFunction, idleTimeout?: number) {
|
export function onFullyIdle(cb: NoneToVoidFunction) {
|
||||||
onIdle(() => {
|
onIdle(() => {
|
||||||
if (getIsAnimating()) {
|
if (getIsAnimating()) {
|
||||||
requestMeasure(() => {
|
requestMeasure(() => {
|
||||||
onFullyIdle(cb, idleTimeout);
|
onFullyIdle(cb);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
cb();
|
cb();
|
||||||
}
|
}
|
||||||
}, idleTimeout);
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -84,16 +84,6 @@ export function throttleWith<F extends AnyToVoidFunction>(schedulerFn: Scheduler
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export function onIdle(cb: NoneToVoidFunction, timeout?: number) {
|
|
||||||
// eslint-disable-next-line no-restricted-globals
|
|
||||||
if (self.requestIdleCallback) {
|
|
||||||
// eslint-disable-next-line no-restricted-globals
|
|
||||||
self.requestIdleCallback(cb, { timeout });
|
|
||||||
} else {
|
|
||||||
onTickEnd(cb);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export const pause = (ms: number) => new Promise<void>((resolve) => {
|
export const pause = (ms: number) => new Promise<void>((resolve) => {
|
||||||
setTimeout(() => resolve(), ms);
|
setTimeout(() => resolve(), ms);
|
||||||
});
|
});
|
||||||
@ -176,6 +166,45 @@ export function onTickEnd(callback: NoneToVoidFunction) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const IDLE_TIMEOUT = 500;
|
||||||
|
|
||||||
|
let onIdleCallbacks: NoneToVoidFunction[] | undefined;
|
||||||
|
|
||||||
|
export function onIdle(callback: NoneToVoidFunction) {
|
||||||
|
// eslint-disable-next-line no-restricted-globals
|
||||||
|
if (!self.requestIdleCallback) {
|
||||||
|
onTickEnd(callback);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!onIdleCallbacks) {
|
||||||
|
onIdleCallbacks = [callback];
|
||||||
|
|
||||||
|
requestIdleCallback((deadline) => {
|
||||||
|
const currentCallbacks = onIdleCallbacks!;
|
||||||
|
onIdleCallbacks = undefined;
|
||||||
|
|
||||||
|
while (currentCallbacks.length) {
|
||||||
|
const cb = currentCallbacks.shift()!;
|
||||||
|
cb();
|
||||||
|
|
||||||
|
if (!deadline.timeRemaining()) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentCallbacks.length) {
|
||||||
|
if (onIdleCallbacks) {
|
||||||
|
// Prepend the remaining callbacks if the next pass is already planned
|
||||||
|
onIdleCallbacks = currentCallbacks.concat(onIdleCallbacks);
|
||||||
|
} else {
|
||||||
|
currentCallbacks.forEach(onIdle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, { timeout: IDLE_TIMEOUT });
|
||||||
|
} else {
|
||||||
|
onIdleCallbacks.push(callback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let beforeUnloadCallbacks: NoneToVoidFunction[] | undefined;
|
let beforeUnloadCallbacks: NoneToVoidFunction[] | undefined;
|
||||||
|
|
||||||
export function onBeforeUnload(callback: NoneToVoidFunction, isLast = false) {
|
export function onBeforeUnload(callback: NoneToVoidFunction, isLast = false) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user