const flushBuffer = async (key: string, buffer: DebounceBuffer<T>) => { if (buffers.get(key) === buffer) {
buffers.delete(key);
} if (buffer.timeout) {
clearTimeout(buffer.timeout);
buffer.timeout = null;
} // Reserve each key's execution slot as soon as the first buffered item // arrives, so later same-key work cannot overtake a timer-backed flush.
releaseBuffer(buffer);
await buffer.task;
};
if (!canDebounce || !key) { if (key) { if (buffers.has(key)) { // Reserve the keyed immediate slot before forcing the pending buffer // to flush so fire-and-forget callers cannot be overtaken. const reservedTask = enqueueReservedKeyTask(key, async () => {
await runFlush([item]);
}); try {
await flushKey(key);
} finally {
reservedTask.release();
}
await reservedTask.task; return;
} if (keyChains.has(key)) {
await enqueueKeyTask(key, async () => {
await runFlush([item]);
}); return;
}
await runFlush([item]);
} else {
await runFlush([item]);
} return;
}
const existing = buffers.get(key); if (existing) {
existing.items.push(item);
existing.debounceMs = debounceMs;
scheduleFlush(key, existing); return;
} if (!canTrackKey(key)) { // When the debounce map is saturated, fall back to immediate keyed work // instead of buffering, but still preserve same-key ordering.
await enqueueKeyTask(key, async () => {
await runFlush([item]);
}); return;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.