react-dedup-async
Version:
https://www.npmjs.com/package/react-dedup-async
28 lines (27 loc) • 703 B
JavaScript
// index.ts
import { useRef } from "react";
function useDedupedAsyncCallback(fn) {
const f = useLatestRef(fn);
let p = null;
let latest;
return useRef(function wrapper(...args) {
latest = args;
return p ? p.then(() => p ?? wrapper(...latest)) : p = f.current(...latest).finally(() => p = null);
}).current;
}
function useDedupedAsyncCallbackIgnoreWhileBusy(fn) {
const f = useLatestRef(fn);
let p = null;
return useRef(
(...args) => p ?? (p = f.current(...args).finally(() => p = null))
).current;
}
function useLatestRef(value) {
const r = useRef(value);
r.current = value;
return r;
}
export {
useDedupedAsyncCallback,
useDedupedAsyncCallbackIgnoreWhileBusy
};