|
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> |
@@ -320,87 +327,135 @@ export class QueryCache { |
320 | 327 | return query |
321 | 328 | } |
322 | 329 |
|
| 330 | + // Parameter syntax |
| 331 | + fetchQuery<TResult = unknown, TError = unknown>( |
| 332 | + queryKey: QueryKey, |
| 333 | + queryConfig?: QueryConfig<TResult, TError> |
| 334 | + ): Promise<TResult> |
| 335 | + |
| 336 | + // Parameter syntax with query function |
| 337 | + fetchQuery<TResult, TError, TArgs extends TypedQueryFunctionArgs>( |
| 338 | + queryKey: QueryKey, |
| 339 | + queryFn: TypedQueryFunction<TResult, TArgs>, |
| 340 | + queryConfig?: QueryConfig<TResult, TError> |
| 341 | + ): Promise<TResult> |
| 342 | + |
| 343 | + fetchQuery<TResult = unknown, TError = unknown>( |
| 344 | + queryKey: QueryKey, |
| 345 | + queryFn: QueryFunction<TResult>, |
| 346 | + queryConfig?: QueryConfig<TResult, TError> |
| 347 | + ): Promise<TResult> |
| 348 | + |
| 349 | + // Object syntax |
| 350 | + fetchQuery<TResult = unknown, TError = unknown>( |
| 351 | + config: FetchQueryObjectConfig<TResult, TError> |
| 352 | + ): Promise<TResult> |
| 353 | + |
| 354 | + // Implementation |
| 355 | + fetchQuery<TResult, TError>( |
| 356 | + arg1: any, |
| 357 | + arg2?: any, |
| 358 | + arg3?: any |
| 359 | + ): Promise<TResult> { |
| 360 | + const [queryKey, config] = getQueryArgs<TResult, TError>(arg1, arg2, arg3) |
| 361 | + |
| 362 | + const resolvedConfig = this.getResolvedQueryConfig(queryKey, { |
| 363 | + // https://github.com/tannerlinsley/react-query/issues/652 |
| 364 | + retry: false, |
| 365 | + ...config, |
| 366 | + }) |
| 367 | + |
| 368 | + let query = this.getQueryByHash<TResult, TError>(resolvedConfig.queryHash) |
| 369 | + |
| 370 | + if (!query) { |
| 371 | + query = this.createQuery(resolvedConfig) |
| 372 | + } |
| 373 | + |
| 374 | + if (!query.isStaleByTime(config.staleTime)) { |
| 375 | + return Promise.resolve(query.state.data as TResult) |
| 376 | + } |
| 377 | + |
| 378 | + return query.fetch(undefined, resolvedConfig) |
| 379 | + } |
| 380 | + |
| 381 | + /** |
| 382 | + * @deprecated |
| 383 | + */ |
323 | 384 | // Parameter syntax with optional prefetch options |
324 | | - async prefetchQuery<TResult = unknown, TError = unknown>( |
| 385 | + prefetchQuery<TResult = unknown, TError = unknown>( |
325 | 386 | queryKey: QueryKey, |
326 | 387 | options?: PrefetchQueryOptions |
327 | 388 | ): Promise<TResult | undefined> |
328 | 389 |
|
329 | 390 | // Parameter syntax with query function and optional prefetch options |
330 | | - async prefetchQuery<TResult, TError, TArgs extends TypedQueryFunctionArgs>( |
| 391 | + prefetchQuery<TResult, TError, TArgs extends TypedQueryFunctionArgs>( |
331 | 392 | queryKey: QueryKey, |
332 | 393 | queryFn: TypedQueryFunction<TResult, TArgs>, |
333 | 394 | options?: PrefetchQueryOptions |
334 | 395 | ): Promise<TResult | undefined> |
335 | 396 |
|
336 | | - async prefetchQuery<TResult = unknown, TError = unknown>( |
| 397 | + prefetchQuery<TResult = unknown, TError = unknown>( |
337 | 398 | queryKey: QueryKey, |
338 | 399 | queryFn: QueryFunction<TResult>, |
339 | 400 | options?: PrefetchQueryOptions |
340 | 401 | ): Promise<TResult | undefined> |
341 | 402 |
|
342 | 403 | // Parameter syntax with query function, config and optional prefetch options |
343 | | - async prefetchQuery<TResult, TError, TArgs extends TypedQueryFunctionArgs>( |
| 404 | + prefetchQuery<TResult, TError, TArgs extends TypedQueryFunctionArgs>( |
344 | 405 | queryKey: QueryKey, |
345 | 406 | queryFn: TypedQueryFunction<TResult, TArgs>, |
346 | 407 | queryConfig: QueryConfig<TResult, TError>, |
347 | 408 | options?: PrefetchQueryOptions |
348 | 409 | ): Promise<TResult | undefined> |
349 | 410 |
|
350 | | - async prefetchQuery<TResult = unknown, TError = unknown>( |
| 411 | + prefetchQuery<TResult = unknown, TError = unknown>( |
351 | 412 | queryKey: QueryKey, |
352 | 413 | queryFn: QueryFunction<TResult>, |
353 | 414 | queryConfig: QueryConfig<TResult, TError>, |
354 | 415 | options?: PrefetchQueryOptions |
355 | 416 | ): Promise<TResult | undefined> |
356 | 417 |
|
357 | 418 | // Object syntax |
358 | | - async prefetchQuery<TResult = unknown, TError = unknown>( |
| 419 | + prefetchQuery<TResult = unknown, TError = unknown>( |
359 | 420 | config: PrefetchQueryObjectConfig<TResult, TError> |
360 | 421 | ): Promise<TResult | undefined> |
361 | 422 |
|
362 | 423 | // Implementation |
363 | | - async prefetchQuery<TResult, TError>( |
364 | | - ...args: any[] |
| 424 | + prefetchQuery<TResult, TError>( |
| 425 | + arg1: any, |
| 426 | + arg2?: any, |
| 427 | + arg3?: any, |
| 428 | + arg4?: any |
365 | 429 | ): Promise<TResult | undefined> { |
366 | 430 | if ( |
367 | | - isPlainObject(args[1]) && |
368 | | - (args[1].hasOwnProperty('throwOnError') || |
369 | | - args[1].hasOwnProperty('force')) |
| 431 | + isPlainObject(arg2) && |
| 432 | + (arg2.hasOwnProperty('throwOnError') || arg2.hasOwnProperty('force')) |
370 | 433 | ) { |
371 | | - args[3] = args[1] |
372 | | - args[1] = undefined |
373 | | - args[2] = undefined |
| 434 | + arg4 = arg2 |
| 435 | + arg2 = undefined |
| 436 | + arg3 = undefined |
374 | 437 | } |
375 | 438 |
|
376 | 439 | const [queryKey, config, options] = getQueryArgs< |
377 | 440 | TResult, |
378 | 441 | TError, |
379 | 442 | PrefetchQueryOptions | undefined |
380 | | - >(args) |
| 443 | + >(arg1, arg2, arg3, arg4) |
381 | 444 |
|
382 | | - const resolvedConfig = this.getResolvedQueryConfig(queryKey, { |
383 | | - // https://github.com/tannerlinsley/react-query/issues/652 |
384 | | - retry: false, |
385 | | - ...config, |
386 | | - }) |
| 445 | + if (options?.force) { |
| 446 | + config.staleTime = 0 |
| 447 | + } |
387 | 448 |
|
388 | | - let query = this.getQueryByHash<TResult, TError>(resolvedConfig.queryHash) |
| 449 | + let promise: Promise<TResult | undefined> = this.fetchQuery( |
| 450 | + queryKey, |
| 451 | + config |
| 452 | + ) |
389 | 453 |
|
390 | | - if (!query) { |
391 | | - query = this.createQuery(resolvedConfig) |
| 454 | + if (!options?.throwOnError) { |
| 455 | + promise = promise.catch(noop) |
392 | 456 | } |
393 | 457 |
|
394 | | - try { |
395 | | - if (options?.force || query.isStaleByTime(config.staleTime)) { |
396 | | - await query.fetch(undefined, resolvedConfig) |
397 | | - } |
398 | | - return query.state.data |
399 | | - } catch (error) { |
400 | | - if (options?.throwOnError) { |
401 | | - throw error |
402 | | - } |
403 | | - } |
| 458 | + return promise |
404 | 459 | } |
405 | 460 |
|
406 | 461 | setQueryData<TResult, TError = unknown>( |
|
0 commit comments