Skip to content

queryClient.clear() breaks with suspense and when query goes from success to fail #2157

@flybayer

Description

@flybayer

Describe the bug

Using queryClient.clear() with suspense enabled causes an infinite loop. We encountered this in Blitz on user logout: blitz-js/blitz#2249

To Reproduce

Add the following to src/react/tests/suspense.test.tsx

  it('should render error boundary when query goes from success to fail with clear()', async () => {
    const key = queryKey()

    let succeed = true
    const consoleMock = mockConsoleError()

    function Page() {
      useQuery(
        key,
        async () => {
          console.log('query')
          await sleep(10)
          if (!succeed) {
            throw new Error('Suspense Error Bingo')
          } else {
            return 'data'
          }
        },
        {
          retry: false,
          suspense: true,
        }
      )
      return <div>rendered</div>
    }

    function App() {
      const { reset } = useQueryErrorResetBoundary()
      return (
        <ErrorBoundary
          onReset={reset}
          fallbackRender={({ resetErrorBoundary }) => (
            <div>
              <div>error boundary</div>
              <button
                onClick={() => {
                  resetErrorBoundary()
                }}
              >
                retry
              </button>
            </div>
          )}
        >
          <React.Suspense fallback="Loading...">
            <Page />
          </React.Suspense>
        </ErrorBoundary>
      )
    }

    const rendered = renderWithClient(queryClient, <App />)

    await waitFor(() => rendered.getByText('Loading...'))
    await waitFor(() => rendered.getByText('rendered'))

    succeed = false
    queryClient.clear()
    await waitFor(() => rendered.getByText('error boundary'))
    consoleMock.mockRestore()
  })

Expected behavior

Should Work

Additional context

React-query 3.13.9

Workaround

-queryClient.clear()
+await queryClient.cancelQueries()
+await queryClient.resetQueries()
+queryClient.getMutationCache().clear()

@tannerlinsley @TkDodo

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions