Skip to content

Instantly share code, notes, and snippets.

@vasylnahuliak
Last active January 24, 2025 15:54
Show Gist options
  • Save vasylnahuliak/a701840a8948a4dbfeafc2001f1941be to your computer and use it in GitHub Desktop.
Save vasylnahuliak/a701840a8948a4dbfeafc2001f1941be to your computer and use it in GitHub Desktop.
useRef with Promise
import { useRef, MutableRefObject } from 'react';
interface PromiseRef<T, E> {
promise: Promise<T>;
resolve: (value: T) => void;
reject: (reason: E) => void;
}
type UsePromiseRefReturn<T, E> = [
MutableRefObject<PromiseRef<T, E> | null>,
() => void,
];
export const usePromiseRef = <T, E>(): UsePromiseRefReturn<T, E> => {
const promiseRef = useRef<PromiseRef<T, E> | null>(null);
const createPromise = () => {
let resolveCallback: (value: T) => void;
let rejectCallback: (reason: E) => void;
const promise = new Promise<T>((resolve, reject) => {
resolveCallback = resolve;
rejectCallback = reject;
});
promiseRef.current = {
promise,
resolve: resolveCallback!,
reject: rejectCallback!,
};
};
return [promiseRef, createPromise];
};
@vasylnahuliak
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment