training_data/packages/client/src/hooks/useAwaitState.ts

32 lines
922 B
TypeScript
Raw Normal View History

2024-09-10 10:31:24 +08:00
import { useState, useEffect, useRef } from 'react';
/**
* Hook: 等待 state
* @param {T} value - state
* @param {T} targetValue - state promise
* @return {Promise<void>} - Promise state targetValue resolve
*/
function useAwaitState<T>(value: T, targetValue: T): Promise<void> {
const [resolved, setResolved] = useState(false);
const resolveRef = useRef<() => void>();
useEffect(() => {
if (value === targetValue) {
setResolved(true);
if (resolveRef.current) {
resolveRef.current();
}
}
}, [value, targetValue]);
return new Promise((resolve) => {
if (resolved) {
resolve();
} else {
resolveRef.current = resolve;
}
});
}
export default useAwaitState;