|
6 | 6 | isOnline, |
7 | 7 | isPlainObject, |
8 | 8 | isServer, |
| 9 | + noop, |
9 | 10 | } from './utils' |
10 | 11 | import { getResolvedQueryConfig } from './config' |
11 | 12 | import { Query } from './query' |
@@ -55,6 +56,12 @@ type QueryPredicate = QueryKey | QueryPredicateFn | true |
55 | 56 |
|
56 | 57 | type QueryPredicateFn = (query: Query<unknown, unknown>) => boolean |
57 | 58 |
|
| 59 | +export interface FetchQueryObjectConfig<TResult, TError> { |
| 60 | + queryKey: QueryKey |
| 61 | + queryFn?: QueryFunction<TResult> |
| 62 | + config?: QueryConfig<TResult, TError> |
| 63 | +} |
| 64 | + |
58 | 65 | export interface PrefetchQueryObjectConfig<TResult, TError> { |
59 | 66 | queryKey: QueryKey |
60 | 67 | queryFn?: QueryFunction<TResult> |
@@ -302,87 +309,135 @@ export class QueryCache { |
302 | 309 | return query |
303 | 310 | } |
304 | 311 |
|
| 312 | + // Parameter syntax |
| 313 | + fetchQuery<TResult = unknown, TError = unknown>( |
| 314 | + queryKey: QueryKey, |
| 315 | + queryConfig?: QueryConfig<TResult, TError> |
| 316 | + ): Promise<TResult> |
| 317 | + |
| 318 | + // Parameter syntax with query function |
| 319 | + fetchQuery<TResult, TError, TArgs extends TypedQueryFunctionArgs>( |
| 320 | + queryKey: QueryKey, |
| 321 | + queryFn: TypedQueryFunction<TResult, TArgs>, |
| 322 | + queryConfig?: QueryConfig<TResult, TError> |
| 323 | + ): Promise<TResult> |
| 324 | + |
| 325 | + fetchQuery<TResult = unknown, TError = unknown>( |
| 326 | + queryKey: QueryKey, |
| 327 | + queryFn: QueryFunction<TResult>, |
| 328 | + queryConfig?: QueryConfig<TResult, TError> |
| 329 | + ): Promise<TResult> |
| 330 | + |
| 331 | + // Object syntax |
| 332 | + fetchQuery<TResult = unknown, TError = unknown>( |
| 333 | + config: FetchQueryObjectConfig<TResult, TError> |
| 334 | + ): Promise<TResult> |
| 335 | + |
| 336 | + // Implementation |
| 337 | + fetchQuery<TResult, TError>( |
| 338 | + arg1: any, |
| 339 | + arg2?: any, |
| 340 | + arg3?: any |
| 341 | + ): Promise<TResult> { |
| 342 | + const [queryKey, config] = getQueryArgs<TResult, TError>(arg1, arg2, arg3) |
| 343 | + |
| 344 | + const resolvedConfig = this.getResolvedQueryConfig(queryKey, { |
| 345 | + // https://github.com/tannerlinsley/react-query/issues/652 |
| 346 | + retry: false, |
| 347 | + ...config, |
| 348 | + }) |
| 349 | + |
| 350 | + let query = this.getQueryByHash<TResult, TError>(resolvedConfig.queryHash) |
| 351 | + |
| 352 | + if (!query) { |
| 353 | + query = this.createQuery(resolvedConfig) |
| 354 | + } |
| 355 | + |
| 356 | + if (!query.isStaleByTime(config.staleTime)) { |
| 357 | + return Promise.resolve(query.state.data as TResult) |
| 358 | + } |
| 359 | + |
| 360 | + return query.fetch(undefined, resolvedConfig) |
| 361 | + } |
| 362 | + |
| 363 | + /** |
| 364 | + * @deprecated |
| 365 | + */ |
305 | 366 | // Parameter syntax with optional prefetch options |
306 | | - async prefetchQuery<TResult = unknown, TError = unknown>( |
| 367 | + prefetchQuery<TResult = unknown, TError = unknown>( |
307 | 368 | queryKey: QueryKey, |
308 | 369 | options?: PrefetchQueryOptions |
309 | 370 | ): Promise<TResult | undefined> |
310 | 371 |
|
311 | 372 | // Parameter syntax with query function and optional prefetch options |
312 | | - async prefetchQuery<TResult, TError, TArgs extends TypedQueryFunctionArgs>( |
| 373 | + prefetchQuery<TResult, TError, TArgs extends TypedQueryFunctionArgs>( |
313 | 374 | queryKey: QueryKey, |
314 | 375 | queryFn: TypedQueryFunction<TResult, TArgs>, |
315 | 376 | options?: PrefetchQueryOptions |
316 | 377 | ): Promise<TResult | undefined> |
317 | 378 |
|
318 | | - async prefetchQuery<TResult = unknown, TError = unknown>( |
| 379 | + prefetchQuery<TResult = unknown, TError = unknown>( |
319 | 380 | queryKey: QueryKey, |
320 | 381 | queryFn: QueryFunction<TResult>, |
321 | 382 | options?: PrefetchQueryOptions |
322 | 383 | ): Promise<TResult | undefined> |
323 | 384 |
|
324 | 385 | // Parameter syntax with query function, config and optional prefetch options |
325 | | - async prefetchQuery<TResult, TError, TArgs extends TypedQueryFunctionArgs>( |
| 386 | + prefetchQuery<TResult, TError, TArgs extends TypedQueryFunctionArgs>( |
326 | 387 | queryKey: QueryKey, |
327 | 388 | queryFn: TypedQueryFunction<TResult, TArgs>, |
328 | 389 | queryConfig: QueryConfig<TResult, TError>, |
329 | 390 | options?: PrefetchQueryOptions |
330 | 391 | ): Promise<TResult | undefined> |
331 | 392 |
|
332 | | - async prefetchQuery<TResult = unknown, TError = unknown>( |
| 393 | + prefetchQuery<TResult = unknown, TError = unknown>( |
333 | 394 | queryKey: QueryKey, |
334 | 395 | queryFn: QueryFunction<TResult>, |
335 | 396 | queryConfig: QueryConfig<TResult, TError>, |
336 | 397 | options?: PrefetchQueryOptions |
337 | 398 | ): Promise<TResult | undefined> |
338 | 399 |
|
339 | 400 | // Object syntax |
340 | | - async prefetchQuery<TResult = unknown, TError = unknown>( |
| 401 | + prefetchQuery<TResult = unknown, TError = unknown>( |
341 | 402 | config: PrefetchQueryObjectConfig<TResult, TError> |
342 | 403 | ): Promise<TResult | undefined> |
343 | 404 |
|
344 | 405 | // Implementation |
345 | | - async prefetchQuery<TResult, TError>( |
346 | | - ...args: any[] |
| 406 | + prefetchQuery<TResult, TError>( |
| 407 | + arg1: any, |
| 408 | + arg2?: any, |
| 409 | + arg3?: any, |
| 410 | + arg4?: any |
347 | 411 | ): Promise<TResult | undefined> { |
348 | 412 | if ( |
349 | | - isPlainObject(args[1]) && |
350 | | - (args[1].hasOwnProperty('throwOnError') || |
351 | | - args[1].hasOwnProperty('force')) |
| 413 | + isPlainObject(arg2) && |
| 414 | + (arg2.hasOwnProperty('throwOnError') || arg2.hasOwnProperty('force')) |
352 | 415 | ) { |
353 | | - args[3] = args[1] |
354 | | - args[1] = undefined |
355 | | - args[2] = undefined |
| 416 | + arg4 = arg2 |
| 417 | + arg2 = undefined |
| 418 | + arg3 = undefined |
356 | 419 | } |
357 | 420 |
|
358 | 421 | const [queryKey, config, options] = getQueryArgs< |
359 | 422 | TResult, |
360 | 423 | TError, |
361 | 424 | PrefetchQueryOptions | undefined |
362 | | - >(args) |
| 425 | + >(arg1, arg2, arg3, arg4) |
363 | 426 |
|
364 | | - const resolvedConfig = this.getResolvedQueryConfig(queryKey, { |
365 | | - // https://github.com/tannerlinsley/react-query/issues/652 |
366 | | - retry: false, |
367 | | - ...config, |
368 | | - }) |
| 427 | + if (options?.force) { |
| 428 | + config.staleTime = 0 |
| 429 | + } |
369 | 430 |
|
370 | | - let query = this.getQueryByHash<TResult, TError>(resolvedConfig.queryHash) |
| 431 | + let promise: Promise<TResult | undefined> = this.fetchQuery( |
| 432 | + queryKey, |
| 433 | + config |
| 434 | + ) |
371 | 435 |
|
372 | | - if (!query) { |
373 | | - query = this.createQuery(resolvedConfig) |
| 436 | + if (!options?.throwOnError) { |
| 437 | + promise = promise.catch(noop) |
374 | 438 | } |
375 | 439 |
|
376 | | - try { |
377 | | - if (options?.force || query.isStaleByTime(config.staleTime)) { |
378 | | - await query.fetch(undefined, resolvedConfig) |
379 | | - } |
380 | | - return query.state.data |
381 | | - } catch (error) { |
382 | | - if (options?.throwOnError) { |
383 | | - throw error |
384 | | - } |
385 | | - } |
| 440 | + return promise |
386 | 441 | } |
387 | 442 |
|
388 | 443 | setQueryData<TResult, TError = unknown>( |
|
0 commit comments