mirror of https://github.com/alibaba/ice.git
				
				
				
			fix: optimize code
This commit is contained in:
		
							parent
							
								
									55f4c22033
								
							
						
					
					
						commit
						7dde0b1d48
					
				|  | @ -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(() => {})); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue