RTK-Query中isSuccess属性为何在请求未完成时就变为true?
为什么RTK Query的useXXXQuery第二次调用时isSuccess会提前为true?
这确实是RTK Query缓存机制导致的预期行为,我来帮你拆解清楚背后的逻辑和解决办法:
核心原因:RTK Query的缓存优先策略
RTK Query的核心设计目标之一就是通过缓存减少不必要的重复请求,提升用户体验。当你第一次发起useGetSomethingQuery请求并成功获取数据后,它会把这个成功的响应结果(包括isSuccess: true的状态)缓存起来。
当你第二次调用同一个Hook(使用相同的payload,也就是相同的缓存键)时,RTK Query会:
- 立即返回缓存中的成功状态和数据——这就是你看到
isSuccess一开始就是true的原因,它并没有等待新请求完成。 - 在后台悄悄发起新的请求(这个过程叫做"重新验证"),用来更新缓存的内容。
这时候虽然isSuccess是true,但当前可能正处于isFetching: true的状态,表示新请求还在进行中。
如何区分缓存数据和最新请求结果?
你可以通过两个状态组合判断:
isSuccess: 表示缓存中存在成功的结果(或者新请求已经成功)isFetching: 表示当前是否有正在进行的请求
如果要确保使用的是最新请求完成后的成功数据,可以在useEffect里这样判断:
const res = useGetSomethingQuery(payload); useEffect(() => { // 只有当请求成功且没有正在进行的请求时,才处理最新数据 if (res.isSuccess && !res.isFetching) { // 使用获取到的最新数据 } }, [res]);
另外,isLoading状态也能帮你区分场景:它只在首次请求时为true,后续的重新验证请求不会触发isLoading,只会触发isFetching。
如果你不想使用缓存,每次都要新鲜数据
如果业务场景要求必须每次都获取最新数据,完全跳过缓存,可以在调用Hook时配置forceRefetch: true:
const res = useGetSomethingQuery(payload, { forceRefetch: true });
或者调整缓存的过期时间(比如设置cacheTime: 0),但这种方式会完全失去缓存带来的性能优势,除非必要不推荐使用。
内容的提问来源于stack exchange,提问作者kyle ausk
相关产品推荐
相关产品推荐

