Skip to content

Commit ffff53f

Browse files
committed
fix: refetch should create new query when removed
1 parent 2b4ed22 commit ffff53f

File tree

11 files changed

+184
-210
lines changed

11 files changed

+184
-210
lines changed

src/core/logger.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@ export function getLogger(): Logger {
2222
return logger
2323
}
2424

25-
export function setLogger(c: Logger) {
26-
logger = c
25+
export function setLogger(newLogger: Logger) {
26+
logger = newLogger
2727
}

src/core/queriesObserver.ts

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,17 @@ export class QueriesObserver {
3131

3232
subscribe(listener?: QueriesObserverListener): () => void {
3333
const callback = listener || (() => undefined)
34+
3435
this.listeners.push(callback)
36+
3537
if (this.listeners.length === 1) {
36-
this.onMount()
38+
this.observers.forEach(observer => {
39+
observer.subscribe(result => {
40+
this.onUpdate(observer, result)
41+
})
42+
})
3743
}
44+
3845
return () => {
3946
this.unsubscribe(callback)
4047
}
@@ -43,22 +50,14 @@ export class QueriesObserver {
4350
private unsubscribe(listener: QueriesObserverListener): void {
4451
this.listeners = this.listeners.filter(x => x !== listener)
4552
if (!this.listeners.length) {
46-
this.clear()
53+
this.destroy()
4754
}
4855
}
4956

50-
onMount(): void {
51-
this.observers.forEach(observer => {
52-
observer.subscribe(result => {
53-
this.onUpdate(observer, result)
54-
})
55-
})
56-
}
57-
58-
clear(): void {
57+
destroy(): void {
5958
this.listeners = []
6059
this.observers.forEach(observer => {
61-
observer.clear()
60+
observer.destroy()
6261
})
6362
}
6463

@@ -112,7 +111,7 @@ export class QueriesObserver {
112111
}
113112

114113
difference(prevObservers, newObservers).forEach(observer => {
115-
observer.clear()
114+
observer.destroy()
116115
})
117116

118117
difference(newObservers, prevObservers).forEach(observer => {
@@ -133,9 +132,9 @@ export class QueriesObserver {
133132
}
134133

135134
private notify(): void {
136-
const { result, listeners } = this
135+
const { result } = this
137136
notifyManager.batch(() => {
138-
listeners.forEach(listener => {
137+
this.listeners.forEach(listener => {
139138
notifyManager.schedule(() => {
140139
listener(result)
141140
})

src/core/query.ts

Lines changed: 26 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,8 @@ import {
77
functionalUpdate,
88
isCancelable,
99
isCancelledError,
10-
isDocumentVisible,
11-
isOnline,
12-
isServer,
1310
isValidTimeout,
11+
isVisibleAndOnline,
1412
noop,
1513
replaceEqualDeep,
1614
sleep,
@@ -163,29 +161,17 @@ export class Query<TData = unknown, TError = unknown, TQueryFnData = TData> {
163161
private scheduleGc(): void {
164162
this.clearGcTimeout()
165163

166-
if (
167-
isServer ||
168-
this.observers.length > 0 ||
169-
!isValidTimeout(this.cacheTime)
170-
) {
171-
return
164+
if (!this.observers.length && isValidTimeout(this.cacheTime)) {
165+
this.gcTimeout = setTimeout(() => {
166+
this.remove()
167+
}, this.cacheTime)
172168
}
173-
174-
this.gcTimeout = setTimeout(() => {
175-
this.remove()
176-
}, this.cacheTime)
177169
}
178170

179171
cancel(options?: CancelOptions): Promise<void> {
180-
const promise: Promise<any> = this.promise || Promise.resolve()
172+
const promise = this.promise
181173
this.cancelFetch?.(options)
182-
return promise.then(noop).catch(noop)
183-
}
184-
185-
private clearTimersObservers(): void {
186-
this.observers.forEach(observer => {
187-
observer.clearTimers()
188-
})
174+
return promise ? promise.then(noop).catch(noop) : Promise.resolve()
189175
}
190176

191177
private clearGcTimeout() {
@@ -231,7 +217,6 @@ export class Query<TData = unknown, TError = unknown, TQueryFnData = TData> {
231217

232218
destroy(): void {
233219
this.clearGcTimeout()
234-
this.clearTimersObservers()
235220
this.cancel()
236221
}
237222

@@ -293,7 +278,7 @@ export class Query<TData = unknown, TError = unknown, TQueryFnData = TData> {
293278
fetchObserver.refetch()
294279
}
295280

296-
// Continue any paused fetch
281+
// Continue fetch if currently paused
297282
this.continueFetch?.()
298283
}
299284

@@ -395,8 +380,7 @@ export class Query<TData = unknown, TError = unknown, TQueryFnData = TData> {
395380
params: unknown[]
396381
): Promise<TData> {
397382
// Create function to fetch the data
398-
const queryFn = options.queryFn || defaultQueryFn
399-
const fetchData = () => queryFn(...params)
383+
const fetchData = () => this.executeQueryFn(options, params)
400384

401385
// Set to fetching state if not already in it
402386
if (!this.state.isFetching) {
@@ -414,7 +398,6 @@ export class Query<TData = unknown, TError = unknown, TQueryFnData = TData> {
414398
params: unknown[],
415399
fetchOptions?: FetchOptions
416400
): Promise<TData> {
417-
const queryFn = options.queryFn || defaultQueryFn
418401
const fetchMore = fetchOptions?.fetchMore
419402
const pageParam = fetchMore?.pageParam
420403
const isFetchingNextPage = fetchMore?.direction === 'forward'
@@ -434,14 +417,12 @@ export class Query<TData = unknown, TError = unknown, TQueryFnData = TData> {
434417
return Promise.resolve(pages)
435418
}
436419

437-
return Promise.resolve()
438-
.then(() => queryFn(...params, param))
439-
.then(page => {
440-
newPageParams = previous
441-
? [param, ...newPageParams]
442-
: [...newPageParams, param]
443-
return previous ? [page, ...pages] : [...pages, page]
444-
})
420+
return this.executeQueryFn(options, [...params, param]).then(page => {
421+
newPageParams = previous
422+
? [param, ...newPageParams]
423+
: [...newPageParams, param]
424+
return previous ? [page, ...pages] : [...pages, page]
425+
})
445426
}
446427

447428
// Create function to fetch the data
@@ -510,6 +491,15 @@ export class Query<TData = unknown, TError = unknown, TQueryFnData = TData> {
510491
)
511492
}
512493

494+
private executeQueryFn(
495+
options: QueryOptions<TData, TError, TQueryFnData>,
496+
params: unknown[]
497+
): Promise<TQueryFnData> {
498+
return options.queryFn
499+
? Promise.resolve(options.queryFn(...params))
500+
: Promise.reject()
501+
}
502+
513503
private tryFetchData(
514504
options: QueryOptions<TData, TError, TQueryFnData>,
515505
fn: QueryFunction
@@ -604,8 +594,9 @@ export class Query<TData = unknown, TError = unknown, TQueryFnData = TData> {
604594
// Pause if needed
605595
.then(() => {
606596
// Pause retry if the document is not visible or when the device is offline
607-
if (!isDocumentVisible() || !isOnline()) {
597+
if (!isVisibleAndOnline()) {
608598
return new Promise(continueResolve => {
599+
// Create callback to continue this fetch
609600
this.continueFetch = continueResolve
610601
})
611602
}
@@ -621,10 +612,6 @@ export class Query<TData = unknown, TError = unknown, TQueryFnData = TData> {
621612
}
622613
}
623614

624-
function defaultQueryFn() {
625-
return Promise.reject()
626-
}
627-
628615
function getNextPageParam<TData, TError, TQueryFnData>(
629616
options: QueryOptions<TData, TError, TQueryFnData>,
630617
pages: TQueryFnData[]

src/core/queryClient.ts

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ import {
22
CancelOptions,
33
QueryFilters,
44
Updater,
5-
isDocumentVisible,
6-
isOnline,
5+
isVisibleAndOnline,
76
noop,
87
parseFilterArgs,
98
parseQueryArgs,
@@ -21,7 +20,7 @@ import type {
2120
QueryOptions,
2221
RefetchOptions,
2322
} from './types'
24-
import type { QueryState, SetDataOptions } from './query'
23+
import type { Query, QueryState, SetDataOptions } from './query'
2524
import type { QueryCache } from './queryCache'
2625
import { QueriesObserver } from './queriesObserver'
2726
import { QueryObserver } from './queryObserver'
@@ -343,25 +342,28 @@ export class QueryClient {
343342

344343
const mountedClients: QueryClient[] = []
345344

346-
function onFocus() {
347-
onExternalEvent('focus')
345+
function getAllQueries() {
346+
return uniq(mountedClients.map(client => client.getCache())).reduce<Query[]>(
347+
(queries, cache) => queries.concat(cache.getAll()),
348+
[]
349+
)
348350
}
349351

350-
function onOnline() {
351-
onExternalEvent('online')
352+
function onFocus() {
353+
if (isVisibleAndOnline()) {
354+
notifyManager.batch(() => {
355+
getAllQueries().forEach(query => {
356+
query.onFocus()
357+
})
358+
})
359+
}
352360
}
353361

354-
function onExternalEvent(type: 'focus' | 'online') {
355-
if (isDocumentVisible() && isOnline()) {
362+
function onOnline() {
363+
if (isVisibleAndOnline()) {
356364
notifyManager.batch(() => {
357-
uniq(mountedClients.map(x => x.getCache())).forEach(cache => {
358-
cache.getAll().forEach(query => {
359-
if (type === 'focus') {
360-
query.onFocus()
361-
} else {
362-
query.onOnline()
363-
}
364-
})
365+
getAllQueries().forEach(query => {
366+
query.onOnline()
365367
})
366368
})
367369
}

0 commit comments

Comments
 (0)