Skip to content

Commit 2ec1979

Browse files
authored
fix(queriesObserver): fix getOptimisticResult, order of returned observers (TanStack#3052)
* fix(queriesObserver): fix getOptimisticResult call Fix queriesObserver to call getOptimisticResult as before. This was a bug introduced in PR TanStack#2866 * fix(queriesObserver): return observers in same order as queries Sort returned observer entries to match the order of queries. Previously, with keepPreviousData: true, the repurposed observers would be returned last, potentially in different order than the queries.
1 parent 5fd537e commit 2ec1979

File tree

2 files changed

+20
-19
lines changed

2 files changed

+20
-19
lines changed

src/core/queriesObserver.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ export class QueriesObserver extends Subscribable<QueriesObserverListener> {
6565

6666
getOptimisticResult(queries: QueryObserverOptions[]): QueryObserverResult[] {
6767
return this.findMatchingObservers(queries).map(match =>
68-
match.observer.getCurrentResult()
68+
match.observer.getOptimisticResult(match.defaultedQueryOptions)
6969
)
7070
}
7171

@@ -121,7 +121,16 @@ export class QueriesObserver extends Subscribable<QueriesObserverListener> {
121121
}
122122
)
123123

124-
return matchingObservers.concat(newOrReusedObservers)
124+
const sortMatchesByOrderOfQueries = (
125+
a: QueryObserverMatch,
126+
b: QueryObserverMatch
127+
): number =>
128+
defaultedQueryOptions.indexOf(a.defaultedQueryOptions) -
129+
defaultedQueryOptions.indexOf(b.defaultedQueryOptions)
130+
131+
return matchingObservers
132+
.concat(newOrReusedObservers)
133+
.sort(sortMatchesByOrderOfQueries)
125134
}
126135

127136
private getObserver(options: QueryObserverOptions): QueryObserver {

src/react/tests/useQueries.test.tsx

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,8 @@ describe('useQueries', () => {
128128
{ status: 'success', data: 5, isPreviousData: false, isFetching: false },
129129
])
130130
expect(states[3]).toMatchObject([
131-
{ status: 'success', data: 2, isPreviousData: false, isFetching: false },
132-
{ status: 'success', data: 5, isPreviousData: false, isFetching: false },
131+
{ status: 'success', data: 2, isPreviousData: true, isFetching: true },
132+
{ status: 'success', data: 5, isPreviousData: true, isFetching: true },
133133
])
134134
expect(states[4]).toMatchObject([
135135
{ status: 'success', data: 2, isPreviousData: true, isFetching: true },
@@ -206,8 +206,8 @@ describe('useQueries', () => {
206206
])
207207

208208
expect(states[3]).toMatchObject([
209-
{ status: 'success', data: 4, isPreviousData: false, isFetching: false },
210-
{ status: 'success', data: 8, isPreviousData: false, isFetching: false },
209+
{ status: 'success', data: 4, isPreviousData: true, isFetching: true },
210+
{ status: 'success', data: 8, isPreviousData: true, isFetching: true },
211211
{
212212
status: 'loading',
213213
data: undefined,
@@ -293,7 +293,7 @@ describe('useQueries', () => {
293293

294294
renderWithClient(queryClient, <Page />)
295295

296-
await waitFor(() => expect(states.length).toBe(10))
296+
await waitFor(() => expect(states.length).toBe(9))
297297

298298
expect(states[0]).toMatchObject([
299299
{
@@ -324,7 +324,7 @@ describe('useQueries', () => {
324324
])
325325
expect(states[3]).toMatchObject([
326326
{ status: 'success', data: 5, isPreviousData: false, isFetching: false },
327-
{ status: 'success', data: 10, isPreviousData: false, isFetching: false },
327+
{ status: 'success', data: 10, isPreviousData: true, isFetching: true },
328328
])
329329
expect(states[4]).toMatchObject([
330330
{ status: 'success', data: 5, isPreviousData: false, isFetching: false },
@@ -335,18 +335,14 @@ describe('useQueries', () => {
335335
{ status: 'success', data: 15, isPreviousData: false, isFetching: false },
336336
])
337337
expect(states[6]).toMatchObject([
338+
{ status: 'success', data: 10, isPreviousData: false, isFetching: true },
338339
{ status: 'success', data: 15, isPreviousData: false, isFetching: false },
339-
{ status: 'success', data: 5, isPreviousData: false, isFetching: false },
340340
])
341341
expect(states[7]).toMatchObject([
342342
{ status: 'success', data: 10, isPreviousData: false, isFetching: true },
343343
{ status: 'success', data: 15, isPreviousData: false, isFetching: false },
344344
])
345345
expect(states[8]).toMatchObject([
346-
{ status: 'success', data: 10, isPreviousData: false, isFetching: true },
347-
{ status: 'success', data: 15, isPreviousData: false, isFetching: false },
348-
])
349-
expect(states[9]).toMatchObject([
350346
{ status: 'success', data: 10, isPreviousData: false, isFetching: false },
351347
{ status: 'success', data: 15, isPreviousData: false, isFetching: false },
352348
])
@@ -390,7 +386,7 @@ describe('useQueries', () => {
390386

391387
renderWithClient(queryClient, <Page />)
392388

393-
await waitFor(() => expect(states.length).toBe(9))
389+
await waitFor(() => expect(states.length).toBe(8))
394390

395391
expect(states[0]).toMatchObject([
396392
{
@@ -426,18 +422,14 @@ describe('useQueries', () => {
426422
{ status: 'success', data: 10, isPreviousData: false, isFetching: false },
427423
])
428424
expect(states[5]).toMatchObject([
429-
{ status: 'success', data: 10, isPreviousData: false, isFetching: false },
430425
{ status: 'success', data: 5, isPreviousData: false, isFetching: true },
426+
{ status: 'success', data: 10, isPreviousData: false, isFetching: false },
431427
])
432428
expect(states[6]).toMatchObject([
433429
{ status: 'success', data: 5, isPreviousData: false, isFetching: true },
434430
{ status: 'success', data: 10, isPreviousData: false, isFetching: false },
435431
])
436432
expect(states[7]).toMatchObject([
437-
{ status: 'success', data: 5, isPreviousData: false, isFetching: true },
438-
{ status: 'success', data: 10, isPreviousData: false, isFetching: false },
439-
])
440-
expect(states[8]).toMatchObject([
441433
{ status: 'success', data: 5, isPreviousData: false, isFetching: false },
442434
{ status: 'success', data: 10, isPreviousData: false, isFetching: false },
443435
])

0 commit comments

Comments
 (0)