TanStack Query 请求取消与请求重试指南
在开始之前,我们需要先安装必要的依赖包。TanStack Query 提供了统一的 API 设计,React 版本和 Vue 版本的安装方式略有不同,但核心概念完全一致。
对于 React 项目,我们需要安装 @tanstack/react-query 包,同时为了方便演示,还会安装 axios 作为 HTTP 客户端。安装命令如下:
对于 Vue3 项目,则需要安装 @tanstack/vue-query 包:
安装完成后,我们需要在应用入口处配置 QueryClientProvider。React 版本通常在 main.tsx 或 App.tsx 中进行配置,而 Vue3 版本则在 main.ts 中进行配置。这一步是必不可少的,因为 TanStack Query 需要通过 Provider 来共享查询客户端实例。
请求取消的实现
TanStack Query 提供了两种取消请求的方式:手动取消和自动取消。手动取消通过 AbortController 来实现,我们可以精确控制何时取消请求;自动取消则由库自动处理,当查询键(queryKey)发生变化或者组件卸载时,未完成的请求会被自动取消。
1、基于 AbortController 手动取消请求
TanStack Query 会在适当的时候(如组件卸载、queryClient.cancelQueries)自动生成一个 AbortSignal,并注入到你的 queryFn 中。你只需要把这个 signal 传给 axios 请求即可。
下面是手动取消请求的完整示例: 在这个示例中,我们创建了一个搜索功能。当用户输入时,我们会先取消之前正在进行的请求,然后创建新的 AbortController 并发起新的请求。这样可以确保用户看到的是最新的搜索结果,而不是被旧请求的结果覆盖。
2、基于 queryClient.cancelQueries 自动取消请求
当查询键(queryKey)发生变化或者组件卸载时,TanStack Query 会自动取消未完成的请求。这是一种非常方便的机制,无需手动编写取消逻辑。
- 该查询的 Promise 会被 reject,抛出一个 CancelledError。
- isLoading 变为 false,error 变为取消错误(可通过 query.isCanceled 判断)。
- 不会自动删除已有数据,也不会触发重新获取。
在全局错误处理中:
请求重试
默认情况下,TanStack Query 会在请求失败时自动重试 3 次,每次重试之间的间隔会逐渐增加(指数退避)。这种设计是经过深思熟虑的:初始重试间隔较短,可以快速恢复失败的请求;如果连续失败,说明网络可能存在较大问题,此时增加间隔可以避免对服务器造成额外压力。
下面是请求重试的完整示例,展示了不同的重试配置方式:

