|
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