如题,假如store中有一个专门获取数据的异步接口 test,但是有很多页面都会发送这个action,是否能控制后续请求从第一个接口中获取呢?
我用的Pinia,当然它应该和vuex比较像
如题,假如store中有一个专门获取数据的异步接口 test,但是有很多页面都会发送这个action,是否能控制后续请求从第一个接口中获取呢?
我用的Pinia,当然它应该和vuex比较像
比如说你有个全局的数据 menuList: []
, 还有一个 menuListState: 0
0表示未初始化,1表示初始化进行中,2表示加载成功,3表示加载失败。
那么你在 action 就可以判断了
if(this.menuListState === 0 || this.menuListState === 4){
this.menuListState = 1;
fetch().then(()=>{
this.menuListState = 2;
}).catch(()=>{
this.menuListState = 3;
})
}
这样操作你就可以判断出来是否是加载中,当然你也可以把 fetch 存起来,以便于在其他结果中返回,也可以再增加过期时间这样的操作。
既然用到pinia在状态管理,就是为了解决多个组件共用数据的问题,所以你的设计可能存在一定的问题,为什么每个组件还在单独请求网络数据, 而不是用pinia的state.
如果真的有每个组件单独请求数据的需要,只能考虑缓存了,用Service Workers也是一种比较方便的解决方案
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
2 回答4.7k 阅读✓ 已解决
4 回答4.3k 阅读✓ 已解决
可以从
Promise
的特性下手。你可以把发起请求的Promise
缓存下来,然后返回给所有发起请求的接口。这样,同时发起的请求,在结果返回前都进去等待状态;当结果返回后都会进入处理进程。代码大概是这样: