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

    Apache支持cgi  1.打开Apache配置文件httpd.conf,搜索“cgi”,找到下面的一段,去掉“addhandler”前面的“#“,这样就开启了Apache的cgi功能 [root@ ...

  2. Maven(一)如何用Eclipse创建一个Maven项目

    1.什么是Maven Apache Maven 是一个项目管理和整合工具.基于工程对象模型(POM)的概念,通过一个中央信息管理模块,Maven 能够管理项目的构建.报告和文档. Maven工程结构和 ...

  3. ACM题目————STL + 全排列

    今天碰到一个函数,感觉挺好用的,全排列函数 next_permutation! 求全排列的函数,基本上与自己写的DFS时间复杂度差不多,毕竟是标准库.(2018-1-4 添加) 话不多说,直接上题. ...

  4. SNMP学习笔记之SNMP4J介绍(Java)

    0x00 SNMP4J介绍 SNMP4J是一个用Java来实现SNMP(简单网络管理协议)协议的开源项目.它支持以命令行的形式进行管理与响应.SNMP4J是纯面向对象设计与SNMP++(用C++实现S ...

  5. Linux LNMP架构搭建

    一.搭建LNMP基本架构 1.L(http) N(nginx) M(mysql) P(php) 2.安装顺序 Mysql-->PHP-->Nginx 3.安装包 Discuz_3. htt ...

  6. Adobe9阅读器渗透攻击——20145301

    Adobe9阅读器渗透攻击 实验步骤: 在kali终端中开启msfconsole,输入命令use exploit/windows/fileformat/adobe_cooltype_sing,进入该漏 ...

  7. BZOJ 1044: [HAOI2008]木棍分割 DP 前缀和优化

    题目链接 咳咳咳,第一次没大看题解做DP 以前的我应该是这样的 哇咔咔,这tm咋做,不管了,先看个题解,再写代码 终于看懂了,卧槽咋写啊,算了还是抄吧 第一问类似于noip的那个跳房子,随便做 这里重 ...

  8. JavaScript:正则表达式 前瞻 找位置

    js中全部都是顺序环视 顺序环视匹配过程 对于顺序肯定环视(?=Expression)来说,当子表达式Expression匹配成功时,(?=Expression)匹配成功,并报告(?=Expressi ...

  9. 51nod 1020 逆序排列 递推DP

    1020 逆序排列  基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么 ...

  10. 在线js编程网站 精品版

    https://jsfiddle.net/ 引自:http://www.ykmimi.com/tools.html