现在因为有个上传组件他用到了这个mixin文件,这个mixin文件中mounted请求了接口,这样一个页面中如果有多个上传组件的话,那么就会导致一上来就会一次性请求多个重复的接口,有什么好点的方法吗,如果不放在vuex中的话
现在因为有个上传组件他用到了这个mixin文件,这个mixin文件中mounted请求了接口,这样一个页面中如果有多个上传组件的话,那么就会导致一上来就会一次性请求多个重复的接口,有什么好点的方法吗,如果不放在vuex中的话
这种情况下的 getSignature 最好是 Singleton 的,可以写个模块导出。mixin 里的 getSignatrue 都直接引用或调用这个 Singleton 的 getSignature。
因为大家都调同一个 Signature,那么可以在这里做一些判断和处理,基本思路就是,
let cache = null;
let count = 0;
async function delay(ms = 200) {
return new Promise(resolve => setTimeout(resolve, ms));
}
export async function getSignature() {
if (cache) { return cache; }
if (count++) {
// 如果有计数说明自己不是第 1 个,就等。注意这里判断的是加之前的 count
// 循环里最好再加个超时判断
while (!cache) { await delay(); }
} else {
// 是第 1 个就去请求
// 如果这里有可能会抛异常,抛异常也不要漏了 count--
// (这个示例代码没做容错,自己加)
cache = await fetchSignature();
}
count--; // 记得减回去,方便以后如果要刷新 cache 的时候用
return cache;
}
你可以全局调用 getSignature()
一次把结果存起来,组件里直接拿结果
或给你的 getSignature()
加个缓存机制,如
let signature = null
const getSignature = () => signature ??= httpGet('...')
给请求加下缓存 思路如下:
定义一个数组 const a = []
然后每次请求给url push 到数组里 作为唯一值
请求完毕弹出对应的url
如果下次请求判断里面有这个url 那么就不再进行请求
那这样肯定不能把getSignature
放到mixin
了,因为你要保持只请求一次,不然处理起来有点复杂,就没太大必要了。
可以在App
的mounted
就调用一次。
如果你不想使用vuex
,那可以通过sessionStorage
来获取。
也可以通过把数据写到vue
的prototype
中,这样在用到的地方就可以通过this.$xxx
来获取。
简单粗暴版:
在初始化时请求接口并保存,然后 getSignature 中直接读取该数据即可,伪代码:
app.js
global.sign = await api();
app.start();
mixin.js
{getSign: () => global.sign}
正常版本:
let cache = null;
async getSignature = () => {
if(cache) return cache;
return await api();
}
我遇到了类似的问题,我的场景是一个图片加载组件在mounted的时候会根据props的图片id去请求图片的url,在列表中展示时,会请求很多次。这个接口是支持单个图片id作为参数 同时也支持id数组作为参数的,也就是说我可以一次请求多个图片id,当调用该接口时,我将短时间内的请求参数进行收集然后合并为一个请求,拿到结果后再进行分发。公司代码不便展示 我这里写了个demo可以参考一下