InhiblabCore / vue-hooks-plus

High performance & Simplicity 🧲 Vue 3 Hooks library
https://InhiblabCore.github.io/docs/hooks
MIT License
1.62k stars 102 forks source link

能否提供一个重复请求合并的功能 #215

Closed Sharang-heng closed 2 months ago

Sharang-heng commented 2 months ago

Describe the bug

假设存在三个兄弟组件分别叫A、B、C,组件内部分别有a,b,c三个获取数据的请求,但是他们三个请求都依赖于请求d(因为a、b、c获取到的是id,需通过d请求获取到名称进行映射)。因此我分别在A、B、C组件的onMounted阶段发起a、b、c请求。函数形如

const a = async () => {
    await d();
    const result =  await generateData()
    return result
  }

不知道是不是因为存在竞态取消,a、b、c理论上会发起三个d请求,但是实际上只有其中一个函数完成请求(假设为a),导致b和c函数的promise一直处于pending状态无法往下走,我原本的想法是给d设置staleTime让其他两个请求直接读取缓存,但似乎也没有效果。useRequest能不能提供一个重复请求合并的功能,即在一段时间内发起的重复请求, 仅请求一次, 并将请求结果分别返回给不同的发起者

Steps to reproduce

No response

System Info

"vue-hooks-plus": "^2.2.0",

Used Package Manager

npm

Validations

XiaoDaiGua-Ray commented 2 months ago

可以考虑一下实现方式的转换,比如在根组件获取到 d,然后通过 provide 注入方式注入 ida, b, c 三个字组件。这样可能更友好一点。

XiaoDaiGua-Ray commented 2 months ago

而且,请求合并在一起然后分发,这个功能可能不是在 useRequest 层面去实现,可以考虑自己在 ajax 层面实现。如果需要并发请求,可能这个文档能帮助到你。 https://inhiblabcore.github.io/docs/hooks/useFetchs/#%E4%BB%A3%E7%A0%81%E6%BC%94%E7%A4%BA

NelsonYong commented 2 months ago

可以考虑一下实现方式的转换,比如在根组件获取到 d,然后通过 provide 注入方式注入 ida, b, c 三个字组件。这样可能更友好一点。

是的,可以先在外部获取到 d 请求的数据,然后提供给 a,b,c , 在 a b c 中使用 useRequest 的依赖收集功能和 ready, 当 d 中有 id 且存在的时候会自动发起请求 @Sharang-heng

NelsonYong commented 2 months ago

可以考虑一下实现方式的转换,比如在根组件获取到 d,然后通过 provide 注入方式注入 ida, b, c 三个字组件。这样可能更友好一点。

是的,可以先在外部获取到 d 请求的数据,然后提供给 a,b,c , 在 a b c 中使用 useRequest 的依赖收集功能和 ready, 当 d 中有 id 且存在的时候会自动发起请求 @Sharang-heng

伪代码

useRequest(service,{ ready:!!id, refreshdeps:[id] })