5月30日 00:37

React Query 如何处理错误和重试?哪些错误不该重试?

React Query 的错误处理要分两层:组件里展示用户能看懂的错误,全局里做日志和兜底通知。重试不要一刀切,网络抖动和 5xx 可以重试,401、403、404、表单校验这类 4xx 通常不该重试;否则只是把错误请求重复打到服务端。

追问

retry 默认是几次?

浏览器端查询默认会重试 3 次,并使用退避延迟;服务端渲染场景通常不建议重试太多,否则会拖慢响应。

retry 和 refetch 有什么区别?

retry 是一次请求失败后的自动补救,refetch 是用户或程序主动重新拉取。错误页里的“再试一次”通常调用 refetch 或 reset error boundary。

Mutation 失败要怎么处理?

如果做了乐观更新,onMutate 里先保存旧数据,onError 里回滚,再提示用户。不要只弹 toast,却让缓存停在错误状态。

全局 onError 适合做什么?

适合上报 Sentry、统一 toast、处理登录过期。具体页面文案仍应在业务组件里判断。

写段代码

ts
useQuery({ queryKey: ['todos'], queryFn: getTodos, retry: (count, error: any) => { if ([400, 401, 403, 404].includes(error.status)) return false; return count < 3; }, retryDelay: i => Math.min(1000 * 2 ** i, 30_000), });
标签:React