Skip to content

Commit 4f00031

Browse files
committed
fix: useQueryState impl
the value of the ref can get out of sync if we only write the ref in the subscribe function
1 parent b8d6851 commit 4f00031

File tree

2 files changed

+17
-34
lines changed

2 files changed

+17
-34
lines changed

packages/react-query/src/__tests__/useIsFetching.test.tsx

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -176,16 +176,11 @@ describe('useIsFetching', () => {
176176
const queryClient = createQueryClient()
177177
const key = queryKey()
178178

179-
let resolve!: () => void
180-
const promise = new Promise<void>((_resolve) => {
181-
resolve = _resolve
182-
})
183-
184179
function Page() {
185180
useQuery({
186181
queryKey: key,
187182
queryFn: async () => {
188-
await promise
183+
await sleep(100)
189184
return 'test'
190185
},
191186
})
@@ -202,35 +197,27 @@ describe('useIsFetching', () => {
202197
const rendered = renderWithClient(queryClient, <Page />)
203198

204199
await rendered.findByText('isFetching: 1')
205-
206-
resolve()
207-
208200
await rendered.findByText('isFetching: 0')
209201
})
210202

211203
it('should use provided custom queryClient', async () => {
212204
const queryClient = createQueryClient()
213205
const key = queryKey()
214206

215-
let resolve!: () => void
216-
const promise = new Promise<void>((_resolve) => {
217-
resolve = _resolve
218-
})
219-
220207
function Page() {
208+
const isFetching = useIsFetching({}, queryClient)
209+
221210
useQuery(
222211
{
223212
queryKey: key,
224213
queryFn: async () => {
225-
await promise
214+
await sleep(10)
226215
return 'test'
227216
},
228217
},
229218
queryClient,
230219
)
231220

232-
const isFetching = useIsFetching({}, queryClient)
233-
234221
return (
235222
<div>
236223
<div>isFetching: {isFetching}</div>
@@ -241,6 +228,5 @@ describe('useIsFetching', () => {
241228
const rendered = render(<Page></Page>)
242229

243230
await waitFor(() => rendered.getByText('isFetching: 1'))
244-
resolve()
245231
})
246232
})

packages/react-query/src/useQueryState.ts

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,7 @@ function getResult<TResult = QueryState>(
2626
.findAll(options.filters)
2727
.map(
2828
(query): TResult =>
29-
(options.select
30-
? options.select(
31-
query as Query<unknown, DefaultError, unknown, QueryKey>,
32-
)
33-
: query.state) as TResult,
29+
(options.select ? options.select(query) : query.state) as TResult,
3430
)
3531
}
3632

@@ -52,19 +48,20 @@ export function useQueryState<TResult = QueryState>(
5248
return React.useSyncExternalStore(
5349
React.useCallback(
5450
(onStoreChange) =>
55-
queryCache.subscribe(() => {
56-
const nextResult = replaceEqualDeep(
57-
result.current,
58-
getResult(queryCache, optionsRef.current),
59-
)
60-
if (result.current !== nextResult) {
61-
result.current = nextResult
62-
notifyManager.schedule(onStoreChange)
63-
}
64-
}),
51+
queryCache.subscribe(notifyManager.batchCalls(onStoreChange)),
6552
[queryCache],
6653
),
67-
() => result.current,
54+
() => {
55+
const nextResult = replaceEqualDeep(
56+
result.current,
57+
getResult(queryCache, optionsRef.current),
58+
)
59+
if (result.current !== nextResult) {
60+
result.current = nextResult
61+
}
62+
63+
return result.current
64+
},
6865
() => result.current,
6966
)!
7067
}

0 commit comments

Comments
 (0)