Skip to content

Commit 1ed1cbc

Browse files
feat: improve polling timeout effect and enabled refetching (#795)
1 parent 9c576d5 commit 1ed1cbc

File tree

1 file changed

+26
-6
lines changed

1 file changed

+26
-6
lines changed

packages/use-dataloader/src/useDataLoader.ts

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
import { useCallback, useEffect, useRef, useState } from 'react'
1+
import {
2+
useCallback,
3+
useEffect,
4+
useLayoutEffect,
5+
useRef,
6+
useState,
7+
} from 'react'
28
import { useDataLoaderContext } from './DataLoaderProvider'
39
import { StatusEnum } from './constants'
410
import DataLoader from './dataloader'
@@ -21,11 +27,20 @@ function useDataLoader<ResultType, ErrorType = Error>(
2127
const methodRef = useRef(method)
2228
const onSuccessRef = useRef(onSuccess)
2329
const onErrorRef = useRef(onError ?? onGlobalError)
30+
const isMountedRef = useRef(false)
2431
const [, setCounter] = useState(0)
2532
const forceRerender = useCallback(() => {
2633
setCounter(current => current + 1)
2734
}, [])
2835

36+
useLayoutEffect(() => {
37+
isMountedRef.current = true
38+
39+
return () => {
40+
isMountedRef.current = false
41+
}
42+
})
43+
2944
const request = getOrAddRequest(fetchKey, {
3045
enabled,
3146
method: methodRef.current,
@@ -75,10 +90,13 @@ function useDataLoader<ResultType, ErrorType = Error>(
7590
}, [onError, onGlobalError])
7691

7792
useEffect(() => {
78-
if (enabled && request.loadCount === 0) {
79-
if (keepPreviousData) {
80-
previousDataRef.current = request.data
81-
}
93+
if (keepPreviousData) {
94+
previousDataRef.current = request.data
95+
}
96+
}, [request.data, keepPreviousData])
97+
98+
useEffect(() => {
99+
if (enabled && !request.isCalled) {
82100
request.load().then(onSuccessRef.current).catch(onErrorRef.current)
83101
}
84102
}, [enabled, request, keepPreviousData])
@@ -87,6 +105,8 @@ function useDataLoader<ResultType, ErrorType = Error>(
87105
let timeout: NodeJS.Timeout
88106

89107
if (
108+
isMountedRef.current &&
109+
request &&
90110
pollingInterval &&
91111
needPolling &&
92112
(request.status === StatusEnum.SUCCESS ||
@@ -106,7 +126,7 @@ function useDataLoader<ResultType, ErrorType = Error>(
106126
}
107127

108128
return () => {
109-
if (timeout) clearTimeout(timeout)
129+
if (timeout && !isMountedRef.current) clearTimeout(timeout)
110130
}
111131
}, [pollingInterval, needPolling, request, request.status, request.data])
112132

0 commit comments

Comments
 (0)