diff --git a/src/react/hook/use-async-effect.ts b/src/react/hook/use-async-effect.ts index 2d19384..dccf83b 100644 --- a/src/react/hook/use-async-effect.ts +++ b/src/react/hook/use-async-effect.ts @@ -1,22 +1,32 @@ import { RefObject, useEffect, DependencyList } from 'react'; import { Deferred } from '../../concurrency/deferred'; +const nextTick = Promise.resolve(); + export function useAsyncEffect( effectCallback: ( running: RefObject, released: PromiseLike, ) => Promise, deps?: DependencyList, + preventDuplicatedRun = false, ): void { useEffect(() => { const mounted = { current: true }; const effectReleased = new Deferred(true); + const run = preventDuplicatedRun + ? async () => { + await nextTick; + if (!mounted.current) return; + return effectCallback(mounted, effectReleased); + } + : () => effectCallback(mounted, effectReleased); if (typeof setImmediate === 'function') { - setImmediate(() => effectCallback(mounted, effectReleased)); + setImmediate(run); } else { - setTimeout(() => effectCallback(mounted, effectReleased)); + setTimeout(run); } return () => {