项目中经常出现需要多次使用的后端数据,通常的做法是通过变量缓存数据,或者通过类似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 }

axios构建缓存池存储基础数据的更多相关文章

  1. docker-compose 构建mongodb并导入基础数据示例

    使用docker-compose构建mongodb服务并导入基础数据示例. 1.文件目录结构 ——mongo/ |——docker-compose.yml |——mongo-Dockerfile |— ...

  2. axios构建请求池处理全局loading状态&&axios避免重复请求

    很多时候我们能够看到类似进度条一样的东西在页面顶部进行加载,代表页面是否加载完成,或者其他的loading效果,我们当然不可能通过promise.all来讲所有的请求合并到一起然后进行处理,这个时候我 ...

  3. 管理ceph缓存池

    目录 缓存池简介 缓存池原理 缓存池的工作模式 配置缓存池 1. 创建一个缓存池 2. 设置缓存层 3. 缓存层相关参数说明 4. 测试缓存池 删除缓存池 1. 删除read-only缓存池 2. 删 ...

  4. oracle缓存池使用解析

    oracle有三种类型的缓存池,分别是default,keep和recycle.默认情况下只会使用default缓存池,另外两种需要额外配置. keep缓存池相当于是一直很热的default缓存池,缓 ...

  5. InnoDB存储引擎--Innodb Buffer Pool(缓存池)

    InnoDB存储引擎--Innodb Buffer Pool(缓存池) Innodb Buffer Pool的概念 InnoDB的Buffer Pool主要用于缓存用户表和索引数据的数据页面.它是一块 ...

  6. vue2.0+webpack+vuerouter+vuex+axios构建项目基础

    前言 本文讲解的是vue2.0+webpack+vuerouter+vuex+axios构建项目基础 步骤 1.全局安装webpack,命令 npm install webpack -g 注意,web ...

  7. 高性能文件缓存key-value存储—Redis

    1.高性能文件缓存key-value存储-Memcached 2.ASP.NET HttpRuntime.Cache缓存类使用总结 备注:三篇博文结合阅读,简单理解并且使用,如果想深入学习,请多参考文 ...

  8. 手游服务端框架之使用Guava构建缓存系统

    缓存的作用与应用场景 缓存,在项目中的应用非常之广泛.诸如这样的场景,某些对象计算或者获取的代码比较昂贵,并且在程序里你不止一次要用到这些对象,那么,你就应该使用缓存. 缓存跟java的Coucurr ...

  9. Atitit 数据存储的数据表连接attilax总结

    Atitit 数据存储的数据表连接attilax总结 1.1. 三种物理连接运算符:嵌套循环连接.合并连接以及哈希连接1 1.2. a.嵌套循环连接(nested loops join)1 1.3. ...

随机推荐

  1. Windows批处理程序bat

    @echo off    关闭回显,否则脚本中的命令都会输出,关闭后只显示结果. setlocal ENABLEDELAYEDEXPANSION 在for循环中变量扩展时需要用到 copy /Y ms ...

  2. javascript中父、子页面间调用

    本文主要转自:http://www.360doc.com/content/11/0525/17/6161903_119333834.shtml                    http://zh ...

  3. Js基础知识6-JavaScript匿名函数和闭包

    匿名函数 1,把匿名函数赋值给变量 var test = function() { return 'guoyu'; }; alert(test);//test是个函数 alert(test()); 2 ...

  4. java多线程-----volatile

    谈谈Java中的volatile   内存可见性 留意复合类操作 解决num++操作的原子性问题 禁止指令重排序 总结 内存可见性 volatile是Java提供的一种轻量级的同步机制,在并发编程中, ...

  5. Linux中Postfix基于SSL收发邮件(九)

    其中在整个一套邮件服务器中,默认信息传输都是明文传输的,所以这个在安全性上面就不是那么好.但是如果说一封邮件从发生到对方接受想要全程做到加密处理这个也是很难的.因为一封邮件从一个域转到另外一个域服务器 ...

  6. Python入门之获取当前所在目录的方法详解

    #本文给大家讲解的是使用python获取当前所在目录的方法以及相关示例,非常的清晰简单,有需要的小伙伴可以参考下 sys.path 模块搜索路径的字符串列表.由环境变量PYTHONPATH初始化得到. ...

  7. Python入门之PyCharm中目录directory与包package的区别

    对于Python而言,有一点是要认识明确的,python作为一个相对而言轻量级的,易用的脚本语言(当然其功能并不仅限于此,在此只是讨论该特点),随着程序的增长,可能想要把它分成几个文件,以便逻辑更加清 ...

  8. margin显示怪异,外边距合并问题

    很多时候我们使用两个div,内层的div设置文字,需要垂直居中与上层div,但是怎么设置样式都不行,vertical-align:middle也不行. 代码: <div style=" ...

  9. java读书笔记二

    这是我的一些读书笔记: 我研究了一下面向对象: 面向对象符合人类看待事物的一般规律,对象的方法的实现细节是包装的,只有对象方法的实现者了解细节 我觉得面向过程是由过程.步骤.函数组成,过程是核心,面向 ...

  10. python函数作用域LEGB

    我们的在学习Python函数的时候,经常会遇到很多定义域的问题,全部变量,内部变量,内部嵌入的函数,等等,Python是如何查找的呢?以及Python又是按照什么顺序来查找的呢?这里做一个顺序的说明 ...