Skip to content

Instantly share code, notes, and snippets.

@frekw
Created August 5, 2020 22:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save frekw/e513f98321c89205ade992e250e2caaf to your computer and use it in GitHub Desktop.
Save frekw/e513f98321c89205ade992e250e2caaf to your computer and use it in GitHub Desktop.
function useAsync() {
const [fn, setFn] = useState(null);
const [state, setState] = useState({
loading: false,
data: null,
error: null
});
const lastCallId = useRef(0);
useEffect(() => {
let awaiting;
if (!fn) {
return () => {};
}
const callId = ++lastCallId.current;
setState(s => ({ ...s, loading: true }));
awaiting = makeCancelable(fn());
awaiting.promise.then(
function(res) {
if (callId !== lastCallId.current) return;
setState({ data: res, error: null, loading: false });
},
function(err) {
if (callId !== lastCallId.current) return;
setState({ data: null, error: err, loading: false });
}
);
return () => {
if (awaiting) {
awaiting.cancel();
}
};
}, [fn]);
return [x => setFn(_ => x), state];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment