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

最新文章

  1. NotePad++中JSLint的使用
  2. jqueryAPI使用之选择器
  3. 【poj3875】 Lights
  4. C#将数据大小字节转换为MB,GB,TB
  5. 推荐一篇好文:OSG OSGearth vs2010编译
  6. 如何提高ASP.NET页面载入速度的方法
  7. delphi 一个线程和主界面的交互的演示代码
  8. [xsd学习]xsd元素限定
  9. php cookie详解
  10. 给jdk写注释系列之jdk1.6容器(9)-Strategy设计模式之Comparable&amp;Comparator接口
  11. MYSQL BLOB 字段大小以及个数的限制測试。
  12. Andriod中WebView加载登录界面获取Cookie信息并同步保存,使第二次不用登录也可查看个人信息。
  13. Android的系统架构
  14. 【PAT L2-001】最短路计数
  15. 转 jquery插件--241个jquery插件—jquery插件大全
  16. js返回值
  17. vs2013 MVC 无法确定要使用哪一版本的 ASP.NET Web Pages错误
  18. hdu 4857 逃生 拓扑排序+PQ,剥层分析
  19. Linux下编译C代码,出现tan函数报错的情况
  20. 开始一个简单的ASP.NET Web API 2 (C#)

热门文章

  1. Python 基本数据类型(2)
  2. 【翻唱】白金disco
  3. bzoj1641 / P2888 [USACO07NOV]牛栏Cow Hurdles
  4. c++标准库多线程入门
  5. 20145104张家明 《Java程序设计》第四次实验设计
  6. Python3基础 __getattr__ 访问不存在的属性时,新增提示功能
  7. Linux系统编程--文件描述符的复制dup()和dup2()【转】
  8. 完美解决vim在终端不能复制的问题
  9. linux下设置软件使用socks5代理
  10. TeeChart设置图表的标题