Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

还在新鲜时间按钮点击数据会改变,且相同cachekey数据不能同步共享 #2313

Closed
1075488066 opened this issue Sep 5, 2023 · 7 comments · Fixed by #2333
Closed
Labels
documentation Improvements or additions to documentation

Comments

@1075488066
Copy link

https://codesandbox.io/s/du-qu-yong-hu-ming-cheng-forked-49m4rs?file=/App.tsx

@1075488066 1075488066 changed the title 还在新鲜时间时按钮还可以点击,且相同cachekey数据不能同步共享 还在新鲜时间按钮点击数据会改变,且相同cachekey数据不能同步共享 Sep 5, 2023
@liuyib
Copy link
Collaborator

liuyib commented Sep 11, 2023

验证了一下,发现是文档没有写清楚。我这里梳理一下:

文档里 cachekey 的介绍没有说明特殊情况。实际上 cacheKey 生效的前提是“请求要真的发送”,也就是“没有设置缓存”或“缓存过期了”。

这点代码中可见,分析如下:

  1. 相同 cachekey 的 useRequest 之间共享数据是通过发布订阅实现的
  2. 数据被认为新鲜时,不重新发请求:
    https://github.com/alibaba/hooks/blob/master/packages/hooks/src/useRequest/src/plugins/useCachePlugin.ts#L77-L84
  3. 而触发订阅(也就是触发共享数据)的逻辑在 onSuccess 中:
    https://github.com/alibaba/hooks/blob/master/packages/hooks/src/useRequest/src/plugins/useCachePlugin.ts#L110-L114
    https://github.com/alibaba/hooks/blob/master/packages/hooks/src/useRequest/src/plugins/useCachePlugin.ts#L24-L31
  4. 因此实际上,缓存状态下,相同 cacheKey 的 useRequest 数据是不同享的

后面我更新文档,注明这些点。

另外,想要实现任何状态下(即使数据被缓存)相同 cacheKey 的 useRequest 共享数据,需要修改现有实现,这将是个 Breaking Chanages。


对于你的用法,目前想要共享数据的话,不能设置缓存数据,staleTime, cacheTime 都不能用

这个 issue 不用关,后面我完善了文档自动会关掉。

@liuyib liuyib added the documentation Improvements or additions to documentation label Sep 11, 2023
@RoyRao2333
Copy link

@liuyib

想请问一下,这个issue后续有跟进吗?

我现在需要设置staleTime = xxx,然后设置一个cacheKey如locationDataKey,这样全局使用useRequest带上这个cacheKey的地方,在xxx时间内都不用重复请求,而是直接使用全局上一次请求的缓存,不知道现在是否能做到呢?

@liuyib
Copy link
Collaborator

liuyib commented Apr 9, 2024

我现在需要设置staleTime = xxx,然后设置一个cacheKey如locationDataKey,这样全局使用useRequest带上这个cacheKey的地方,在xxx时间内都不用重复请求,而是直接使用全局上一次请求的缓存,不知道现在是否能做到呢?

@RoyRao2333 我明白你的需求,但是要知道每个 useRequest 的“新鲜时间”是单独计算的,例如:

const { refresh: refresh1 } = useRequest(() => login(), {
  cacheKey: "share_key",
  staleTime: 5 * 1000,
});
const { refresh: refresh2 } = useRequest(() => login(), {
  cacheKey: "share_key",
  staleTime: 10 * 1000,
});

上述代码,由于两个 useRequest 都设置了 cacheKey,所以只要发起新请求了,就会共享数据。但是在各自的 staleTime 时间内,你去调用 refresh/run 方法发请求,都会走缓存的逻辑,不会触发新请求,此时不会共享数据。

我感觉可以满足你的需求,但是要注意,staleTime 不是全局共享的,各自单独计算。

@RoyRao2333
Copy link

@liuyib 感谢回复。

我感觉可以满足你的需求

  1. 那请问在目前useRequest的设计方案下,有没有好的workaround来实现我的需求呢?

另外,想要实现任何状态下(即使数据被缓存)相同 cacheKey 的 useRequest 共享数据,需要修改现有实现,这将是个 Breaking Chanages

  1. 未来useRequest有没有打算实现这个Breaking Chanages呢?

谢谢!

@liuyib
Copy link
Collaborator

liuyib commented Apr 9, 2024

  1. 那请问在目前useRequest的设计方案下,有没有好的workaround来实现我的需求呢?

目前没有

  1. 未来useRequest有没有打算实现这个Breaking Chanages呢?

感觉你的需求和这个 issue 给的 codesandbox demo 不太一样。从 demo 看,这个 issue 需要的是:有 staleTime 的请求,在缓存期间也能给没有 staleTime 的请求共享数据。而你目前的需求,我的理解是:所有 cacheKey 相同的请求,共享 staleTime 并且 共享数据。多了一点“共享 staleTime”

不知道我对你需求的理解是否正确。不过确实数据共享这块,对缓存的支持不太优雅。

@RoyRao2333
Copy link

@liuyib

是的,需要对相同的cacheKey之间共享staleTime。我最初以为,订阅某一个cacheKey的时候,会同时继承其附加属性如staleTime和cacheTime。

但是每一个useRequest都会生成一个新的订阅,并且每个useRequest都可以设置自己单独的参数 😂 想来只能配合localStorage或者redux来存储,请求之前先检查是否有缓存了

@liuyib
Copy link
Collaborator

liuyib commented Apr 9, 2024

但是每一个useRequest都会生成一个新的订阅,并且每个useRequest都可以设置自己单独的参数 😂 想来只能配合localStorage或者redux来存储,请求之前先检查是否有缓存了

是这样,需要自己处理了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation Improvements or additions to documentation
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants