Skip to content

Commit 7acff81

Browse files
feat: dont clear cached data when no observer (#599)
1 parent 5e6edc0 commit 7acff81

File tree

2 files changed

+18
-29
lines changed

2 files changed

+18
-29
lines changed

packages/use-dataloader/src/DataLoaderProvider.tsx

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import React, {
55
createContext,
66
useCallback,
77
useContext,
8-
useEffect,
98
useMemo,
109
useRef,
1110
} from 'react'
@@ -182,24 +181,6 @@ const DataLoaderProvider = ({
182181
[getRequest],
183182
)
184183

185-
useEffect(() => {
186-
const cleanRequest = () => {
187-
setTimeout(() => {
188-
Object.keys(requestsRef.current).forEach(key => {
189-
if (requestsRef.current[key].getObserversCount() === 0) {
190-
// Worst case there is a memleak
191-
// eslint-disable-next-line @typescript-eslint/no-floating-promises
192-
requestsRef.current[key].destroy()
193-
delete requestsRef.current[key]
194-
}
195-
})
196-
cleanRequest()
197-
}, 300)
198-
}
199-
200-
cleanRequest()
201-
}, [])
202-
203184
const value = useMemo(
204185
() => ({
205186
addRequest,

packages/use-dataloader/src/__tests__/DataLoaderProvider.test.tsx

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,14 @@ import { KEY_IS_NOT_STRING_ERROR, StatusEnum } from '../constants'
77
const TEST_KEY = 'test'
88
const PROMISE_TIMEOUT = 5
99
const fakePromise = () =>
10-
new Promise(resolve => { setTimeout(() => resolve(true), PROMISE_TIMEOUT) })
10+
new Promise(resolve => {
11+
setTimeout(() => resolve(true), PROMISE_TIMEOUT)
12+
})
1113

1214
const fakeNullPromise = () =>
13-
new Promise(resolve => { setTimeout(() => resolve(null), PROMISE_TIMEOUT) })
15+
new Promise(resolve => {
16+
setTimeout(() => resolve(null), PROMISE_TIMEOUT)
17+
})
1418

1519
const wrapper = ({ children }: { children: ReactNode }) => (
1620
<DataLoaderProvider>{children}</DataLoaderProvider>
@@ -108,7 +112,11 @@ describe('DataLoaderProvider', () => {
108112
wrapper,
109113
})
110114
act(() => {
111-
result.current.addRequest(TEST_KEY, {
115+
result.current.getOrAddRequest(TEST_KEY, {
116+
enabled: true,
117+
method,
118+
})
119+
result.current.getOrAddRequest(TEST_KEY, {
112120
enabled: true,
113121
method,
114122
})
@@ -125,6 +133,8 @@ describe('DataLoaderProvider', () => {
125133
expect(result.current.getCachedData(TEST_KEY)).toBe(undefined)
126134
expect(result.current.getCachedData()).toStrictEqual({ test: undefined })
127135
expect(result.current.getRequest(TEST_KEY)).toBeDefined()
136+
const unknownReload = result.current.getReloads('unknown')
137+
expect(unknownReload).toBeUndefined()
128138
await act(async () => {
129139
await reloads.test()
130140
})
@@ -141,20 +151,15 @@ describe('DataLoaderProvider', () => {
141151
expect(result.current.getCachedData(TEST_KEY)).toBeUndefined()
142152
act(() => result.current.clearAllCachedData())
143153
expect(result.current.getCachedData()).toStrictEqual({ test: undefined })
144-
await waitFor(() =>
145-
expect(result.current.getRequest(TEST_KEY)).toBeUndefined(),
146-
)
147154

148155
try {
149156
// @ts-expect-error Should throw an error
150157
result.current.clearCachedData(3)
151158
} catch (e) {
152159
expect((e as Error).message).toBe(KEY_IS_NOT_STRING_ERROR)
153160
}
154-
expect(result.current.getReloads()).not.toHaveProperty(TEST_KEY)
155-
expect(result.current.getReloads(TEST_KEY)).not.toBeDefined()
156161
expect(result.current.getCachedData(TEST_KEY)).toBe(undefined)
157-
expect(result.current.getCachedData()).not.toStrictEqual({
162+
expect(result.current.getCachedData()).toStrictEqual({
158163
test: undefined,
159164
})
160165
try {
@@ -184,7 +189,10 @@ describe('DataLoaderProvider', () => {
184189

185190
test('should delay max concurrent request', async () => {
186191
const method = jest.fn(
187-
() => new Promise(resolve => { setTimeout(() => resolve(true), 100) }),
192+
() =>
193+
new Promise(resolve => {
194+
setTimeout(() => resolve(true), 100)
195+
}),
188196
)
189197
const { result, waitFor } = renderHook(useDataLoaderContext, {
190198
wrapper: wrapperWith2ConcurrentRequests,

0 commit comments

Comments
 (0)