zoukankan      html  css  js  c++  java
  • axios构建缓存池存储基础数据

    项目中经常出现需要多次使用的后端数据,通常的做法是通过变量缓存数据,或者通过类似vuex的东西来进行缓存,但是麻烦在于很可能需要判断一大堆的条件,或者说如果有权限控制的时候数据能否读取也是很麻烦的事情

    所以这里提供一个比较简单的解决方案,通过在对象中存储请求路径以及参数甚至是token,然后拦截发起的请求,然后判断从缓存中读取数据还是重新请求数据

    import axios from 'axios'
    
    //创建axios实例化对象且配置部分默认参数
    const http = axios.create({
      baseURL: '/api/v2',    //默认域名
      timeout: 80000,    //超时限制
      withCredentials: true,    //跨域时使用凭证,默认带上cookies
      headers: {    //默认配置请求头,请求格式为application/json
        'Content-Type': 'application/json;charset=UTF-8',
        Accept: 'application/json'
      }
    });
    
    // 缓存
    // 缓存存储格式:get和post请求数据单独分为两个对象,分别存储url+params的拼接结果作为key值,缓存值作为value
    const cache = {get: {}, post: {}};
    
    /*
    * 对象key值排序方法,保证不同顺序的key值对比有效
    */
    function objKeySort(obj) {
        var newkey = Object.keys(obj).sort();
      //先用Object内置类的keys方法获取要排序对象的属性名,再利用Array原型上的sort方法对获取的属性名进行排序,newkey是一个数组
        var newObj = {};//创建一个新的对象,用于存放排好序的键值对
        for (var i = 0; i < newkey.length; i++) {//遍历newkey数组
            newObj[newkey[i]] = obj[newkey[i]];//向新创建的对象中按照排好的顺序依次增加键值对
        }
        return newObj;//返回排好序的新对象
    }
    
    
    // 重载axios的方法
    // put和delete方法不提供缓存
    class newHttp {
      constructor() {
        this.http = http
      }
      get(url, params, isCache) {
        if (isCache) {
          let cacheurl = url.charAt(0) == '/' ? url : '/' + url;
          let cacheObj = {};
        // get请求参数可能存在于url中,所以单独处理一次
    if(/?/.test(cacheUrl)) { let tempArr = cacheUrl.match(/?(.*)$/)[1]; tempArr.forEach(v => { let temp = v.split('='); cacheObj[temp[0]] = cacheObj[temp[1]]; }); cacheUrl = cacheUrl.match.match(/^(.*)(?=?)/)[0]; } Object.assign(cacheObj, params ? params: {}); let cacheParams = cacheurl + JSON.stringify(objKeySort(cacheObj)); if (cache.get[cacheParams]) { return new Promise((reslove, reject) => { reslove(Object.assign({}, cache.get[cacheParams])); }) } else { return this.http.get(cacheUrl, cacheObj).then(res => { cache.get[cacheParams] = res; return res; }); } } else { return this.http.get(cacheUrl, cacheObj); } } post(url, params, isCache) { if (isCache) { let cacheurl = url.charAt(0) == '/' ? url : '/' + url; let cacheObj = {}; Object.assign(cacheObj, params ? params: {}); let cacheParams = cacheurl + JSON.stringify(objKeySort(cacheObj)); if (cache.post[cacheParams]) { return new Promise((reslove, reject) => { reslove(Object.assign({}, cache.post[cacheParams])); }) } else { return this.http.post(cacheUrl, cacheObj).then(res => { cache.post[cacheParams] = res; return res; }); } } else { return this.http.post(cacheUrl, cacheObj); } } put(url, params) { return this.http.put(url, params); } delete(url, params) { return this.http.delete(url, params); } all(arg) { return Promise.all(arg); } }
    const utilHttp
    = new newHttp();
      export { utilHttp, cache }
  • 相关阅读:
    SR-IOV(Single Root I/O Virtualization)
    DHCP&DHCPv6
    Linux 上的基础网络设备详解
    当Linux用尽内存-oom
    真爱了--网络工程师技能图谱
    程序员必备技能:如何画好架构图?
    Linux内存使用情况以及内存泄露情况
    Neutron 消息回调系统
    linux bridge
    OpenStack-Neutron-code
  • 原文地址:https://www.cnblogs.com/timmer/p/8557962.html
Copyright © 2011-2022 走看看