axios构建缓存池存储基础数据
2024-08-24 16:24:15
项目中经常出现需要多次使用的后端数据,通常的做法是通过变量缓存数据,或者通过类似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 }
最新文章
- NotePad++中JSLint的使用
- jqueryAPI使用之选择器
- 【poj3875】 Lights
- C#将数据大小字节转换为MB,GB,TB
- 推荐一篇好文:OSG OSGearth vs2010编译
- 如何提高ASP.NET页面载入速度的方法
- delphi 一个线程和主界面的交互的演示代码
- [xsd学习]xsd元素限定
- php cookie详解
- 给jdk写注释系列之jdk1.6容器(9)-Strategy设计模式之Comparable&;Comparator接口
- MYSQL BLOB 字段大小以及个数的限制測试。
- Andriod中WebView加载登录界面获取Cookie信息并同步保存,使第二次不用登录也可查看个人信息。
- Android的系统架构
- 【PAT L2-001】最短路计数
- 转 jquery插件--241个jquery插件—jquery插件大全
- js返回值
- vs2013 MVC 无法确定要使用哪一版本的 ASP.NET Web Pages错误
- hdu 4857 逃生 拓扑排序+PQ,剥层分析
- Linux下编译C代码,出现tan函数报错的情况
- 开始一个简单的ASP.NET Web API 2 (C#)
热门文章
- Python 基本数据类型(2)
- 【翻唱】白金disco
- bzoj1641 / P2888 [USACO07NOV]牛栏Cow Hurdles
- c++标准库多线程入门
- 20145104张家明 《Java程序设计》第四次实验设计
- Python3基础 __getattr__ 访问不存在的属性时,新增提示功能
- Linux系统编程--文件描述符的复制dup()和dup2()【转】
- 完美解决vim在终端不能复制的问题
- linux下设置软件使用socks5代理
- TeeChart设置图表的标题