fix: optimize code

This commit is contained in:
ClarkXia 2024-07-09 13:58:57 +08:00
parent 55f4c22033
commit 7dde0b1d48
1 changed files with 28 additions and 8 deletions

View File

@ -47,7 +47,29 @@ const getHydrateData = (id: string) => {
};
};
const querySet = new Set<string>();
class QueryClient {
queryCache: Map<string, Promise<any>>;
constructor() {
this.queryCache = new Map();
}
setQueryData(key: string, promise: Promise<any>) {
if (key) {
this.queryCache.set(key, promise);
}
}
getQueryData(key: string) {
return this.queryCache.get(key);
}
removeQueryData(key: string) {
this.queryCache.delete(key);
}
}
const queryClient = new QueryClient();
interface SuspenseDataProps {
queryKey?: string;
@ -61,28 +83,26 @@ export function useSuspenseData(request?: Request, options?: SuspenseDataProps)
const { data, done, promise, update, error, id } = suspenseState;
const { hasHydrateData, data: hydrateData } = getHydrateData(id);
const queryInProcess = options?.queryKey && querySet.has(options.queryKey);
const queryInProcess = options?.queryKey && queryClient.getQueryData(options.queryKey);
let thenable: Promise<any> = null;
if (!hasHydrateData && !error && !done && !promise && request && !queryInProcess) {
thenable = request(requestContext);
thenable.then((response) => {
querySet.delete(options?.queryKey);
queryClient.removeQueryData(options?.queryKey);
update({
done: true,
data: response,
promise: null,
});
}).catch(e => {
querySet.delete(options?.queryKey);
queryClient.removeQueryData(options?.queryKey);
update({
done: true,
error: e,
promise: null,
});
});
if (options?.queryKey) {
querySet.add(options.queryKey);
}
queryClient.setQueryData(options?.queryKey, thenable);
}
React.useEffect(() => {
@ -133,7 +153,7 @@ export function useSuspenseData(request?: Request, options?: SuspenseDataProps)
throw thenable;
} else {
// Throw a pending promise to Suspense, otherwise the component will be error because of undefined data.
throw new Promise(() => {});
throw (queryClient.getQueryData(options?.queryKey) || new Promise(() => {}));
}
}