UNPKG

@ohm-vision/react-async

Version:

Extentions to React to support asynchronous calls

42 lines (41 loc) 1.36 kB
import { useEffect, useState } from "react"; /** * Basic wrapper to support an asynchronous call * @param effect asynchronous effect * @param deps Dependency List * @param destructor Destructor * @returns `true` if the effect is still running, or `false` once the effect completes */ export function useEffectAsync(effect, deps, destructor) { var _a = useState(true), loading = _a[0], setLoading = _a[1]; useEffect(function () { // reset the loading state setLoading(true); //- create an abort controller where var ctrl = new AbortController(); var _abort = ctrl.abort.bind(ctrl); ctrl.abort = function abort(reason) { _abort(reason); this.signal.throwIfAborted(); }; // fire effect effect(ctrl) .catch(function (e) { if (ctrl.signal.aborted) { console.debug("[useEffectAsync] - signal aborted", ctrl.signal.reason); return; } throw e; }) .finally(function () { return setLoading(false); }); return function () { // signal abort _abort("deps"); // fire deconstructor if (typeof destructor === "function") { destructor(); } }; }, deps); return loading; }