Skip to content

Commit 465906a

Browse files
authoredDec 10, 2024··
fix(query-core): respect initialData for queryClient.ensureQueryData (#8425)
* fix(query-core): respect initialData for queryClient.ensureQueryData we used to call `getQueryData` before queryCache.build(), but building is what creates the query and potentially adds initialData. I tried to make that more obvious by reading directly from `query.state.data` * refactor: simplify condition
1 parent 27ce0b6 commit 465906a

File tree

2 files changed

+26
-12
lines changed

2 files changed

+26
-12
lines changed
 

‎packages/query-core/src/__tests__/queryClient.test.tsx

+15
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,21 @@ describe('queryClient', () => {
477477
}),
478478
).resolves.toEqual('new')
479479
})
480+
481+
test('should not fetch with initialDat', async () => {
482+
const key = queryKey()
483+
const queryFn = vi.fn().mockImplementation(() => Promise.resolve('data'))
484+
485+
await expect(
486+
queryClient.ensureQueryData({
487+
queryKey: [key, 'id'],
488+
queryFn,
489+
initialData: 'initial',
490+
}),
491+
).resolves.toEqual('initial')
492+
493+
expect(queryFn).toHaveBeenCalledTimes(0)
494+
})
480495
})
481496

482497
describe('ensureInfiniteQueryData', () => {

‎packages/query-core/src/queryClient.ts

+11-12
Original file line numberDiff line numberDiff line change
@@ -145,23 +145,22 @@ export class QueryClient {
145145
>(
146146
options: EnsureQueryDataOptions<TQueryFnData, TError, TData, TQueryKey>,
147147
): Promise<TData> {
148-
const cachedData = this.getQueryData<TData>(options.queryKey)
148+
const defaultedOptions = this.defaultQueryOptions(options)
149+
const query = this.#queryCache.build(this, defaultedOptions)
150+
const cachedData = query.state.data
149151

150152
if (cachedData === undefined) {
151153
return this.fetchQuery(options)
152-
} else {
153-
const defaultedOptions = this.defaultQueryOptions(options)
154-
const query = this.#queryCache.build(this, defaultedOptions)
155-
156-
if (
157-
options.revalidateIfStale &&
158-
query.isStaleByTime(resolveStaleTime(defaultedOptions.staleTime, query))
159-
) {
160-
void this.prefetchQuery(defaultedOptions)
161-
}
154+
}
162155

163-
return Promise.resolve(cachedData)
156+
if (
157+
options.revalidateIfStale &&
158+
query.isStaleByTime(resolveStaleTime(defaultedOptions.staleTime, query))
159+
) {
160+
void this.prefetchQuery(defaultedOptions)
164161
}
162+
163+
return Promise.resolve(cachedData)
165164
}
166165

167166
getQueriesData<

0 commit comments

Comments
 (0)
Please sign in to comment.