/* 缓存管理器 cacheLen:最多缓存多少个数据 id:唯一值 name:方法名 syncFunc:加载函数 */ class cacheManage { //cacheLen:最多缓存多少个数据 constructor(cacheLen){ this.cacheLen=cacheLen||20; this.cacheData=[]; } //查询数据 getCacheIndex (val, key) { let has = -1 for (let i = this.cacheData.length - 1; i >= 0; i--) { if (val === this.cacheData[i][key]) { has = i break } } return has } /**option: * id:数据的唯一标识 * cacheTime:请求前,数据在缓存时间内,则返回缓存数据 * errTime:请求失败后,数据是否在缓存时间内,则返回缓存数据 * */ async getCacheSync(option,syncFunc){ const id=option.id const cacheTime=option.cacheTime&&typeof option.cacheTime !== 'number'?300:option.cacheTime const errTime=option.errTime&&typeof option.errTime !== 'number'?300:option.errTime; const has =this.getCacheIndex(id, 'id') const cacheData=this.cacheData if(has > -1&&cacheTime&&cacheTime * 1000 + cacheData[has].time > +new Date()){ return cacheData[has].data; } try { const data=await syncFunc() if (has > -1) { cacheData.splice(has, 1) }else if (cacheData.length > this.cacheLen) { cacheData.splice(0, 1) } cacheData.push({ id: id, time: +new Date(), data: data }) return data; }catch (e) { //兼容查询失败的情况 if(has > -1&&errTime&&errTime * 1000 + cacheData[has].time > +new Date()){ return cacheData[has].data; } throw e; } } /**option: * id:数据的唯一标识 * */ getCache(option,func){ const id=option.id const has =this.getCacheIndex(id, 'id') const cacheData=this.cacheData if(has>-1){ return cacheData[has].data; } const data= func(); if (cacheData.length > this.cacheLen) { cacheData.splice(0, 1) } cacheData.push({ id: id, data: data }) return data; } }