diff --git a/src/react/hook/use-async-effect.ts b/src/react/hook/use-async-effect.ts index 3ae039e..7b2c988 100644 --- a/src/react/hook/use-async-effect.ts +++ b/src/react/hook/use-async-effect.ts @@ -7,16 +7,23 @@ export function useAsyncEffect( effectCallback: ( running: RefObject, released: PromiseLike, + abortSignal: AbortSignal, ) => Promise, deps?: DependencyList, ): void { useEffect(() => { const mounted = { current: true }; const effectReleased = new Deferred(true); + let abortController: AbortController = null!; + try { + if (effectCallback.length >= 3) { + abortController = new AbortController(); + } + } catch (ignored: unknown) {} nextTick .then(() => { if (!mounted.current) return; - return effectCallback(mounted, effectReleased); + return effectCallback(mounted, effectReleased, abortController?.signal); }) .catch((e) => { console.error('useAsyncEffect error', e); @@ -25,6 +32,7 @@ export function useAsyncEffect( return () => { effectReleased.fulfill(undefined); mounted.current = false; + abortController?.abort(); }; }, deps); }