-
-
Notifications
You must be signed in to change notification settings - Fork 2.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
An infinite refetch occurs when an error response is received when using useQueries. #4644
Comments
interesting, thanks for reporting. I wonder why the same doesn't happen for
There must be something in query/packages/react-query/src/errorBoundaryUtils.ts Lines 27 to 34 in 34ca558
|
@TkDodo Thank you for your quick reply. I tried many things by referring to your answer, but when I modified the Anyway, your answer was very helpful. Thank you 🙇♂️ 😃 |
yes, this is exactly what the
I still think you, as a user, should not need to set that flag to |
I have prepared a failing unit test for this scenario #4882 |
I already created a wrapper around the useQueries function for better handling types and queries. /** @version 1.0.0 */
export function useQueries<Qs extends any[]>({ queries }: { queries: readonly [...{ [Key in keyof Qs]: Qs[Key] & GetOptions<Qs[Key]> }] }): QueryResults<Qs>
{
const loads = React.useMemo(() => queries.map(options => Query.prepare(options.queryFn)), [])
const errorResetBoundary = useQueryErrorResetBoundary() // <- get the error boundary QueryErrorResetBoundaryValue
return useQueriesBase({
// @ts-ignore
queries: queries.map(
(options, index) =>
{
const queryKey = options.queryKey
const enabled = areValidArgs(queryKey)
const load = loads[index]
return {
...Query.Options.get(options.queryFn),
retryOnMount: errorResetBoundary.isReset(), // <- this line here
...options,
queryFn: enabled ? load : undefined,
enabled,
queryKey: enabled ? queryKey : undefined,
}
}
),
}) as QueryResults<Qs>
} So a quick fix for users who use import { useQueries as useQueriesBase, useQueryErrorResetBoundary } from "@tanstack/react-query"
export const useQueries: typeof useQueriesBase = options =>
{
const errorResetBoundary = useQueryErrorResetBoundary()
return useQueriesBase({
...options,
queries: options.queries.map(query => ({ retryOnMount: errorResetBoundary.isReset(), ...query })),
})
} |
if someone wants to tackle this one, please do. The failing test case provided by @chekrd should be helpful: |
…e refetch useQuery correctly handles checks on error boundary before retry. This work will change useQueries to match behavior. Fixes TanStack#4644
@TkDodo I gave this a shot in the dark. There were some clear differences with the order of operations between More info in the PR. Let me know your thoughts! |
…e refetch (#5271) * fix(useQueries): check error boundary before retry to prevent infinite refetch useQuery correctly handles checks on error boundary before retry. This work will change useQueries to match behavior. Fixes #4644 * style: fix formatting --------- Co-authored-by: Hancock, Matthew <Matthew_Hancock@comcast.com> Co-authored-by: Dominik Dorfmeister <office@dorfmeister.cc>
Describe the bug
An infinite refetch occurs when an error response is received when using useQueries.
However, when remove the suspense query option, an infinite refresh does not occur.
And it is a situation where the Errorboundary cannot catch the error.
It can be reproduced by correcting the request url to cause an error in the link below.
Your minimal, reproducible example
https://codesandbox.io/s/angry-diffie-rekf90?file=/src/query.ts:278-577
Steps to reproduce
Expected behavior
When using useQueries, I want the retry and suspense options to work properly and I hope the ErrorBoundary can catch errors well.
How often does this bug happen?
Every time
Screenshots or Videos
No response
Platform
mac os
chrome
108.0.5359.98
Tanstack Query version
v4.19.1
TypeScript version
v4.9.4
Additional context
No response
The text was updated successfully, but these errors were encountered: