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、处理登录过期。具体页面文案仍应在业务组件里判断。
写段代码
tsuseQuery({ 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), });