Skip to content

Commit ed2944d

Browse files
committed
fix(query-db-collection): sync=on-demand tanstack-query lifecycle
1 parent 5eb8300 commit ed2944d

File tree

3 files changed

+29
-16
lines changed

3 files changed

+29
-16
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
'@tanstack/query-db-collection': patch
3+
---
4+
5+
Fix on-demand sync behavior so the full TanStack Query lifecycle is respected.
6+
7+
This patch resolves an issue where using on-demand synchronization could break the query lifecycle, including the error reported in https://github.com/TanStack/db/issues/998.

packages/query-db-collection/src/query.ts

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -692,13 +692,16 @@ export function queryCollectionOptions(
692692
// Query is still loading, wait for the first result
693693
return new Promise<void>((resolve, reject) => {
694694
const unsubscribe = observer.subscribe((result) => {
695-
if (result.isSuccess) {
696-
unsubscribe()
697-
resolve()
698-
} else if (result.isError) {
699-
unsubscribe()
700-
reject(result.error)
701-
}
695+
// Use a microtask in case `subscribe` is called synchronously, before `unsubscribe` is initialized
696+
queueMicrotask(() => {
697+
if (result.isSuccess) {
698+
unsubscribe()
699+
resolve()
700+
} else if (result.isError) {
701+
unsubscribe()
702+
reject(result.error)
703+
}
704+
})
702705
})
703706
})
704707
}
@@ -745,13 +748,16 @@ export function queryCollectionOptions(
745748
// Create a promise that resolves when the query result is first available
746749
const readyPromise = new Promise<void>((resolve, reject) => {
747750
const unsubscribe = localObserver.subscribe((result) => {
748-
if (result.isSuccess) {
749-
unsubscribe()
750-
resolve()
751-
} else if (result.isError) {
752-
unsubscribe()
753-
reject(result.error)
754-
}
751+
// Use a microtask in case `subscribe` is called synchronously, before `unsubscribe` is initialized
752+
queueMicrotask(() => {
753+
if (result.isSuccess) {
754+
unsubscribe()
755+
resolve()
756+
} else if (result.isError) {
757+
unsubscribe()
758+
reject(result.error)
759+
}
760+
})
755761
})
756762
})
757763

packages/query-db-collection/tests/query.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4219,7 +4219,7 @@ describe(`QueryCollection`, () => {
42194219
defaultOptions: {
42204220
queries: {
42214221
gcTime: 5 * 60 * 1000, // 5 minutes
4222-
staleTime: 0,
4222+
staleTime: Infinity, // set an Infinity staleTime to prevent a refetch
42234223
retry: false,
42244224
},
42254225
},
@@ -4562,7 +4562,7 @@ describe(`QueryCollection`, () => {
45624562
const testQueryClient = new QueryClient({
45634563
defaultOptions: {
45644564
queries: {
4565-
staleTime: 0,
4565+
staleTime: Infinity, // set an Infinity staleTime to prevent a refetch
45664566
gcTime: 300,
45674567
retry: false,
45684568
},

0 commit comments

Comments
 (0)