@benev/slate
Version:
frontend web stuff
37 lines • 1.04 kB
JavaScript
export function debounce(delay, action) {
let latestArgs;
let timeout;
let waitingQueue = [];
function reset() {
latestArgs = [];
if (timeout)
clearTimeout(timeout);
timeout = undefined;
waitingQueue = [];
}
reset();
return ((...args) => {
latestArgs = args;
if (timeout)
clearTimeout(timeout);
const promise = new Promise((resolve, reject) => {
waitingQueue.push({ resolve, reject });
});
timeout = setTimeout(() => {
Promise.resolve()
.then(() => action(...latestArgs))
.then(r => {
for (const { resolve } of waitingQueue)
resolve(r);
reset();
})
.catch(err => {
for (const { reject } of waitingQueue)
reject(err);
reset();
});
}, delay);
return promise;
});
}
//# sourceMappingURL=debounce.js.map