Files
2026-02-13 22:02:30 +01:00

56 lines
1.3 KiB
JavaScript

// https://developer.mozilla.org/en-US/docs/Web/API/queueMicrotask
// https://nodejs.org/api/process.html#when-to-use-queuemicrotask-vs-processnexttick
export const nextTick = globalThis.queueMicrotask ? (cb, ...args) => {
globalThis.queueMicrotask(cb.bind(undefined, ...args));
} : /* @__PURE__ */ createNextTickWithTimeout();
// Fallback for runtimes not implementing queueMicrotask
function createNextTickWithTimeout() {
let queue = [];
let draining = false;
let currentQueue;
let queueIndex = -1;
function cleanUpNextTick() {
if (!draining || !currentQueue) {
return;
}
draining = false;
if (currentQueue.length > 0) {
queue = [...currentQueue, ...queue];
} else {
queueIndex = -1;
}
if (queue.length > 0) {
drainQueue();
}
}
function drainQueue() {
if (draining) {
return;
}
const timeout = setTimeout(cleanUpNextTick);
draining = true;
let len = queue.length;
while (len) {
currentQueue = queue;
queue = [];
while (++queueIndex < len) {
if (currentQueue) {
currentQueue[queueIndex]();
}
}
queueIndex = -1;
len = queue.length;
}
currentQueue = undefined;
draining = false;
clearTimeout(timeout);
}
const nextTick = (cb, ...args) => {
queue.push(cb.bind(undefined, ...args));
if (queue.length === 1 && !draining) {
setTimeout(drainQueue);
}
};
return nextTick;
}