Skip to content

Commit

Permalink
Smarter waitForDebounce that resolve only with the last promise
Browse files Browse the repository at this point in the history
  • Loading branch information
garronej committed Feb 2, 2023
1 parent 28259fd commit cced15d
Showing 1 changed file with 27 additions and 12 deletions.
39 changes: 27 additions & 12 deletions src/tools/waitForDebounce.ts
Original file line number Diff line number Diff line change
@@ -1,27 +1,42 @@
import { Deferred } from "evt/tools/Deferred";
import { assert } from "tsafe/assert";

export function waitForDebounceFactory(params: { delay: number }) {
const { delay } = params;

let d: Deferred<void | never> | undefined = undefined;
let curr: { timer: ReturnType<typeof setTimeout>; startTime: number; } | undefined = undefined;

function waitForDebounce(): Promise<void | never> {

if (d !== undefined) {
return new Promise<void>(() => { /* Never resolve */ });
}
const dOut = new Deferred<void | never>();

const timerCallback = () => {
curr = undefined;
dOut.resolve();

};

if (curr !== undefined) {

clearTimeout(curr.timer);

curr.timer = setTimeout(timerCallback, delay - (Date.now() - curr.startTime));

d = new Deferred();
return dOut.pr;

setTimeout(() => {
assert(d !== undefined);
d.resolve();
d = undefined;
}, delay);
} else {

return d.pr;
const startTime = Date.now();

curr = {
"timer": setTimeout(timerCallback, delay),
startTime
};

}

return dOut.pr;
}

return { waitForDebounce };
}

0 comments on commit cced15d

Please sign in to comment.