跳过正文

spa单页web应用内存缓存

·63 字·1 分钟
jiladahe1997
作者
jiladahe1997
To see the world as it is, and to love it

sap内存缓存
#

在单页应用中,由于所有页面的都在一个js中,因此部分请求其实完全是可以公用的。例如常见的有:用户信息、通用节假日信息(用于限制时间选择器)。

因此针对这些请求,完全可以通过一个全局变量进行缓存和访问。

那么需要做到以下几点:

  1. 需要一个全局的变量

  2. 这个变量不一定在入口就要加载(比如b页面需要这个数据,那么不需要进index就加载)

  3. 使用的时候耦合性要低,比如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并行。

较较较为优化的

36c91ff875ef98b2fd45e310480721be.png