Skip to content

Commit a717387

Browse files
scttcperclaude
andcommitted
fix(ui): Fix "Missing queryFn" error in useAggregatedQueryKeys
QueryObserver was created without a queryFn to listen for when fetchQuery resolved. In TanStack Query v5 this throws "Missing queryFn" whenever the observer evaluates stale data. Fires on every batch of IDs buffered through useReplayCount so it spams on any issue list page. Replace the observer with .finally() on the fetchQuery promise to clean up inFlight markers — simpler and doesn't need the subscription ref cleanup. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 88ba368 commit a717387

File tree

1 file changed

+11
-23
lines changed

1 file changed

+11
-23
lines changed

static/app/utils/api/useAggregatedQueryKeys.tsx

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,10 @@ import type {ApiResult} from 'sentry/api';
44
import {defined} from 'sentry/utils';
55
import {uniq} from 'sentry/utils/array/uniq';
66
import type {ApiQueryKey} from 'sentry/utils/queryClient';
7-
import {fetchDataQuery, QueryObserver, useQueryClient} from 'sentry/utils/queryClient';
7+
import {fetchDataQuery, useQueryClient} from 'sentry/utils/queryClient';
88

99
const BUFFER_WAIT_MS = 20;
1010

11-
type Subscription = () => void;
12-
1311
interface Props<AggregatableQueryKey, Data> {
1412
/**
1513
* The queryKey reducer
@@ -90,14 +88,6 @@ export function useAggregatedQueryKeys<AggregatableQueryKey, Data>({
9088

9189
const key = getQueryKey([]).at(0);
9290

93-
const subscriptions = useRef<Subscription[]>([]);
94-
useEffect(() => {
95-
const subs = subscriptions.current;
96-
return () => {
97-
subs.forEach(unsubscribe => unsubscribe());
98-
};
99-
}, []);
100-
10191
// The query keys that this instance cares about
10292
const prevQueryKeys = useRef<AggregatableQueryKey[]>([]);
10393

@@ -148,19 +138,17 @@ export function useAggregatedQueryKeys<AggregatableQueryKey, Data>({
148138
});
149139

150140
const queryKey = getQueryKey(queuedAggregatableBatch);
151-
queryClient.fetchQuery({
152-
queryKey,
153-
queryFn: fetchDataQuery,
154-
});
155-
156-
const observer = new QueryObserver(queryClient, {queryKey});
157-
const unsubscribe = observer.subscribe(_result => {
158-
queryClient.removeQueries({
159-
queryKey: ['aggregate', cacheKey, key, 'inFlight'],
160-
predicate: isQueryKeyInBatch,
141+
queryClient
142+
.fetchQuery({
143+
queryKey,
144+
queryFn: fetchDataQuery,
145+
})
146+
.finally(() => {
147+
queryClient.removeQueries({
148+
queryKey: ['aggregate', cacheKey, key, 'inFlight'],
149+
predicate: isQueryKeyInBatch,
150+
});
161151
});
162-
});
163-
subscriptions.current.push(unsubscribe);
164152

165153
if (allQueuedQueries.length > queuedQueriesBatch.length) {
166154
fetchData();

0 commit comments

Comments
 (0)