vue axios 缓存 接口请求实现缓存加载

        文章写的多了,开头就不知道怎么写了,硬挤一些句子总觉的卖弄。其实更多的想留下各位看官,多多的点赞,多多的关注,多的收藏。为将来的博客化动作做好前期数据粉丝基础。哦哦哦,我在想啥呢。。这大下午的。。。。嘿嘿。。。。。。。

        言归正传,不阿传。

        开发过程中总有一些数据存放在服务器,但是这些数据基本上一旦生成不会再变,比如省市区三级联动数据、一些静态数据字典等。每次进入页面每次都通过接口加载,总不是最好的方案。今天闲来针对 axios请求库里面增加缓存功能,纯手撸逻辑,抛砖引玉提供一个思路。以下为源代码:

注意此缓存为内存缓存模型,未写入localstorage,你自己可以实现localstorage缓存读取。

        


/**缓存池,此缓存为内存缓存模块,未写入localstorage,你自己可以实现localstorage缓存读取*/
const cache = {};

const sortParams = (params)=>{
    params = params?params:{}
    let sort = Object.keys(params).sort();
    return sort.reduce((sorted,key)=>{
        sorted[key] = params[key]
        return sorted;
    },{})
}


const serializedParams = (params) => {
    let p = Object.entries(params).map(([key,value]) => `$[key=${encodeURIComponent(value)}`).join('&')
    return p
}

const generateCacheKey = (config)=>{
    const {url,params} = config;
    const sp = sortParams(params)
    const sep = serializedParams(sp);

    return `${url}${sep}`
}


const cacheAdapter = (config) =>{
    const cacheKey = generateCacheKey(config);
    const response = cache[cacheKey];
    if (config.cache && response)
    {
        return Promise.resolve(response);
    }
    return axios.defaults.adapter(config);
}


const saveCache = (config,data) =>{
    const cacheKey = generateCacheKey(config);
    const rp = JSON.parse(JSON.stringify(data));
    cache[cacheKey] = rp
}



// 创建axios实例
const service = axios.create({
    baseURL:
        process.env.NODE_ENV === "production"
            ? process.env.VUE_APP_BASE_API
            : "/", // api 的 base_url
    timeout: Config.timeout, // 请求超时时间
    adapter:cacheAdapter
});

// request拦截器
service.interceptors.request.use(
    (config) => {
        if (getToken()) {
            config.headers["Authorization"] = getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
        }
        config.headers["Content-Type"] = "application/json";
        return config;
    },
    (error) => {
        Promise.reject(error);
    }
);

// response 拦截器
service.interceptors.response.use(
    (response) => {
        if (response.config.cache)
        {
            saveCache(response.config,response)
        }
        return response.data;
    },
    (error) => {
        // 兼容blob下载出错json提示
        return Promise.reject(error);
    }
);
export default service;

 在调用接口的地方稍微改造一下:增加一个属性:cache:true时则会读取缓存进行接口响应。不使用缓存时,这个值给false或者是不给这个属性即可。

A、使用缓存:

B、不使用缓存:

相关推荐

  1. MyBatis 延迟,一级缓存,二级缓存设置

    2024-03-20 05:22:06       12 阅读
  2. 枚举+链对缓存实现以读取为主的请求接口

    2024-03-20 05:22:06       31 阅读
  3. 如何使用PHP开发缓存优化图片速度

    2024-03-20 05:22:06       30 阅读
  4. Mybatis学习笔记:多表关联,懒缓存

    2024-03-20 05:22:06       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-20 05:22:06       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-20 05:22:06       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-20 05:22:06       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-20 05:22:06       20 阅读

热门阅读

  1. GO-Gin-Example 第六部分 将Golang应用部署到Docker

    2024-03-20 05:22:06       23 阅读
  2. SpringMVC的执行原理

    2024-03-20 05:22:06       16 阅读
  3. gin | gin环境搭建与示例工程

    2024-03-20 05:22:06       21 阅读
  4. 嵌入式学习-ARM-Day4

    2024-03-20 05:22:06       18 阅读
  5. ARM32day4

    ARM32day4

    2024-03-20 05:22:06      16 阅读
  6. 【ARM】FPU,VFP,ASE,NEON,SVE...是什么意思?

    2024-03-20 05:22:06       24 阅读
  7. 数据仓库的两种建模方法

    2024-03-20 05:22:06       17 阅读
  8. ARM day4

    2024-03-20 05:22:06       19 阅读
  9. linux环境部署

    2024-03-20 05:22:06       23 阅读
  10. 深度学习&PyTorch 之 transformer-中文多分类

    2024-03-20 05:22:06       18 阅读
  11. LLM的测试工具:LaVague平替成国内大模型

    2024-03-20 05:22:06       17 阅读
  12. SIFT和SURF的差异已经使用场景分析

    2024-03-20 05:22:06       17 阅读
  13. 图像分割在疾病诊断中的应用案例

    2024-03-20 05:22:06       18 阅读
  14. 深入了解提示词工程:原理、实践与应用

    2024-03-20 05:22:06       21 阅读