sap内存缓存 #
在单页应用中,由于所有页面的都在一个js中,因此部分请求其实完全是可以公用的。例如常见的有:用户信息、通用节假日信息(用于限制时间选择器)。
因此针对这些请求,完全可以通过一个全局变量进行缓存和访问。
那么需要做到以下几点:
-
需要一个全局的变量
-
这个变量不一定在入口就要加载(比如b页面需要这个数据,那么不需要进index就加载)
-
使用的时候耦合性要低,比如a、b页面都需要这个变量,那么在开发c页面的时候不需要去重新理解a、b页面的逻辑。
因此我想到了一个简单的方法:
举个🌰:
utils.js:
let USERINFO
function async getuserinfo(){
if not userinfo {
const USERINFO=(await axios. get('/userinfo'\).data
USERINFO= res.data
}
return USERINFO
}
以上变写好了一个getuserinfo函数,在整个spa(可能有几十个组件)的任何地方都可以直接调用这个函数获取用户信息,并且自动判断是否有缓存,是不是很方便。
如果你回答是,那就是,但其实上不是。
假设一个比较常见的场景,某个页面数据敏感,后端为了记录操作人,要求每个get或者post请求都必须带userinfo。
那么这个页面的created阶段你就会这样写。
async created(){
This.getData('')
})
然而你会发现,为啥还是发了两次getuserinfo请求????
这里就要涉及到async await原理了。简单来说,上面的data1请求先执行,执行到await getuserinfo函数后会发现没有USERINFO缓存,然后执行getuserinfo请求。 在请求还没有返回时,退出执行data2请求,又执行await getuserinfo,还是没有USERINFO缓存,然后执行getuserinfo请求。
这就是why发了两次请求。
那么有什么解决方案吗? 最简单粗暴的 await data1,await data2,await data3。 强制第一个getuserinfo返回后再执行第二个请求。 但是这个方法一看就很拉稀,原因就是请求变成串行的了。
较为优化的: 只await data1, data2 data3继续并行。 但是奉行:代码是给人看的,偶尔给机器运行。这句话,这样写显然违背了这个初衷。
较较为优化的: 先await getuserinfo(),然后data123并行。
较较较为优化的