完成后你将能够
能把同一个 signal 传给一组相关请求,区分组件卸载与真正取消,并知道 Suspense 查询的限制。
提供 signal 不等于自动中止网络
Query 会向 queryFn 提供 AbortSignal,但默认未使用的请求仍可完成并写入缓存。只有请求库消费 signal 后,取消才会中止 Promise,并让 Query 恢复到取消前的状态。
把同一个 signal 传完整条请求链
原生 fetch 直接接受 signal。先检查 response.ok,再解析 JSON;一个 queryFn 发出多个相关请求时,将相同 signal 传给每一个请求,避免只取消链路的一部分。
import { queryOptions } from '@tanstack/react-query'
export const issuesOptions = queryOptions({
queryKey: ['issues', 'list'] as const,
queryFn: async ({ signal }) => {
const response = await fetch('/api/issues', { signal })
if (!response.ok) throw new Error('Unable to load issues')
return response.json()
},
})把本课变成可验证的能力
Query 提供的同一 AbortSignal 传入整条请求链,过期请求停止 I/O 且不伪装成成功。
实现快速切换 Issue 时取消旧详情请求,并记录 AbortError 与普通网络错误的不同处理。
在慢速网络下快速切换路由;旧请求应显示为 canceled,新请求正常完成,缓存不出现空数据闪烁。
- 拿到 signal 却没有传给 fetch。
- 捕获取消异常后返回空数组,导致 Query 标记成功。