框架
版本

查询重试

injectQuery 查询失败(查询函数抛出错误)时,如果该查询的请求尚未达到连续重试的最大次数(默认为 3 次)或提供了确定是否允许重试的函数,TanStack Query 将自动重试该查询。

您可以在全局级别和单个查询级别配置重试。

  • 设置 retry = false 将禁用重试。
  • 设置 retry = 6 将在显示函数抛出的最终错误之前重试失败的请求 6 次。
  • 设置 retry = true 将无限次重试失败的请求。
  • 设置 retry = (failureCount, error) => ... 允许根据请求失败的原因进行自定义逻辑。
ts
import { injectQuery } from '@tanstack/angular-query-experimental'

// Make a specific query retry a certain number of times
const result = injectQuery(() => ({
  queryKey: ['todos', 1],
  queryFn: fetchTodoListPage,
  retry: 10, // Will retry failed requests 10 times before displaying an error
}))
import { injectQuery } from '@tanstack/angular-query-experimental'

// Make a specific query retry a certain number of times
const result = injectQuery(() => ({
  queryKey: ['todos', 1],
  queryFn: fetchTodoListPage,
  retry: 10, // Will retry failed requests 10 times before displaying an error
}))

信息:error 属性的内容将作为 injectQueryfailureReason 响应属性的一部分,直到最后一次重试尝试。因此,在上面的示例中,在最后一次重试尝试之前的 9 次重试尝试中(总共 10 次尝试),任何错误内容都将作为 failureReason 属性的一部分,如果所有重试尝试后错误仍然存在,最终它们将作为 error 属性的一部分。

重试延迟

默认情况下,TanStack Query 中的重试不会在请求失败后立即发生。按照标准,每次重试尝试都会逐渐应用回退延迟。

默认的 retryDelay 设置为每次尝试翻倍(从 1000 毫秒开始),但不会超过 30 秒。

ts
// Configure for all queries
import {
  QueryCache,
  QueryClient,
  QueryClientProvider,
} from '@tanstack/angular-query-experimental'

const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000),
    },
  },
})

bootstrapApplication(AppComponent, {
  providers: [provideTanStackQuery(queryClient)],
})
// Configure for all queries
import {
  QueryCache,
  QueryClient,
  QueryClientProvider,
} from '@tanstack/angular-query-experimental'

const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000),
    },
  },
})

bootstrapApplication(AppComponent, {
  providers: [provideTanStackQuery(queryClient)],
})

虽然不推荐,但你可以在插件和单个查询选项中覆盖 retryDelay 函数/整数。如果设置为整数而不是函数,则延迟将始终是相同的时间量。

ts
const result = injectQuery(() => ({
  queryKey: ['todos'],
  queryFn: fetchTodoList,
  retryDelay: 1000, // Will always wait 1000ms to retry, regardless of how many retries
}))
const result = injectQuery(() => ({
  queryKey: ['todos'],
  queryFn: fetchTodoList,
  retryDelay: 1000, // Will always wait 1000ms to retry, regardless of how many retries
}))