diff --git a/src/queryCache.js b/src/queryCache.js index fa2c69d123..97597549cd 100644 --- a/src/queryCache.js +++ b/src/queryCache.js @@ -72,6 +72,7 @@ export function makeQueryCache() { const foundQueries = findQueries(predicate, { exact }) foundQueries.forEach(query => { + clearTimeout(query.staleTimeout) delete cache.queries[query.queryHash] }) @@ -230,9 +231,7 @@ export function makeQueryCache() { return } query.staleTimeout = setTimeout(() => { - if (query) { - dispatch({ type: actionMarkStale }) - } + dispatch({ type: actionMarkStale }) }, query.config.staleTime) } diff --git a/src/tests/queryCache.test.js b/src/tests/queryCache.test.js index 065fb1b9f0..03d1577aab 100644 --- a/src/tests/queryCache.test.js +++ b/src/tests/queryCache.test.js @@ -108,4 +108,15 @@ describe('queryCache', () => { const data = queries.map(query => query.state.data) expect(data).toEqual(['data1', 'data2']) }) + + test('stale timeout dispatch is not called if query is no longer in the query cache', async () => { + const queryKey = 'key' + const fetchData = () => Promise.resolve('data') + await queryCache.prefetchQuery(queryKey, fetchData) + const query = queryCache.getQuery(queryKey) + expect(query.state.isStale).toBe(false) + queryCache.removeQueries(queryKey) + await sleep(50) + expect(query.state.isStale).toBe(false) + }) })