【发布时间】:2023-03-31 10:40:01
【问题描述】:
我有一个 useFetch 钩子。如果在数据未决时再次调用 fetchData 函数,则调用 controller.abort() 并重新运行该函数。唯一的问题是 React 更新调度函数的速度不够快。我怎样才能做到这一点,以便在调用 controller.abort() 函数时,它会等到所有状态更改完成后再重新运行 fetchData 函数。我使用 useEffect 对其进行了拍摄,但无法使其正常工作。谢谢!
export const useFetchStats = (callNumber: number, params?: any) => {
const { statsDispatch } = useAppState();
const [error, setError] = useState(null);
const [status, setStatus] = useState<any>(null);
const [isLoading] = useState(false);
const newUrl = new URL(`${process.env.REACT_APP_STATS_ENDPOINT}${statsCalls[callNumber].url}`
);
const dispatch: any = statsCalls[callNumber].type;
let controller: any = null;
const fetchData = async () => {
controller = new AbortController();
const requestOptions: RequestInit = {
method: "GET",
headers: myHeaders,
redirect: "follow",
signal: controller.signal,
};
statsDispatch({ type: dispatch, isLoading: true });
try {
const res = await fetch(newUrl.href, requestOptions);
setStatus(res);
const json = await res.json();
statsDispatch({ type: dispatch, data: json });
} catch (error) {
setError(error);
} finally {
statsDispatch({ type: dispatch, isLoading: false });
}
};
const abortFetch = () => {
controller && controller.abort();
};
useEffect(() => {
fetchData();
}, [abortFetch]);
return [fetchData, isLoading, abortFetch, error, status];
};
【问题讨论】:
标签: javascript reactjs react-hooks