useAsyncEffect(
async (signal, onAbort) => {
}
, [params])
на глаза попадается какая-то дичь
Поэтому написал свою наивную реализацию, критика велком
const isAbortError = (e: unknown) => e && typeof e === 'object' && 'name' in e && e.name === 'AbortError';
const useAsyncEffect = (cb: (signal: AbortSignal, onAbort: (cb: () => void) => void) => Promise<void>, deps?: React.DependencyList) => {
useEffect(() => {
const controller = new AbortController();
(async () => {
try {
const onAbort = (cb: () => void) => {
if (controller.signal.aborted) {
cb();
} else {
controller.signal.addEventListener('abort', cb, { once: true });
}
};
await cb(controller.signal, onAbort);
} catch (e) {
if (!(isAbortError(e))) {
queueMicrotask(() => {throw e});
}
}
})();
return () => controller.abort();
}, deps);
};