@ohm-vision/react-async
Version:
Extentions to React to support asynchronous calls
42 lines (41 loc) • 1.36 kB
JavaScript
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;
}