try {
this.sProxy.setItem(key, JSON.stringify(entity));
return true;
} catch (e) {
//localstorage写满时,全清掉
if (e.name == 'QuotaExceededError') {
// this.sProxy.clear();
//localstorage写满时,选择离过期时间最近的数据删除,这样也会有些影响,但是感觉比全清除好些,如果缓存过多,此过程比较耗时,100ms以内
if (!this.removeLastCache()) throw '本次数据存储量过大';
this.set(key, value, timeout, sign);
}
console && console.log(e);
}
return false;
},
//删除过期缓存
removeOverdueCache: function () {
var tmpObj = null, i, len;
var now = new Date().getTime();
//取出键值对
var cacheStr = this.sProxy.getItem(this.keyCache);
var cacheMap = [];
var newMap = [];
if (!cacheStr) {
return;
}
cacheMap = JSON.parse(cacheStr);
for (i = 0, len = cacheMap.length; i < len; i++) {
tmpObj = cacheMap[i];
if (tmpObj.timeout < now) {
this.sProxy.removeItem(tmpObj.key);
} else {
newMap.push(tmpObj);
}
}
this.sProxy.setItem(this.keyCache, JSON.stringify(newMap));
},
removeLastCache: function () {
var i, len;
var num = this.removeNum || 5;
//取出键值对
var cacheStr = this.sProxy.getItem(this.keyCache);
var cacheMap = [];
var delMap = [];
//说明本次存储过大
if (!cacheStr) return false;
cacheMap.sort(function (a, b) {
return a.timeout - b.timeout;
});
//删除了哪些数据
delMap = cacheMap.splice(0, num);
for (i = 0, len = delMap.length; i < len; i++) {
this.sProxy.removeItem(delMap[i].key);
}
this.sProxy.setItem(this.keyCache, JSON.stringify(cacheMap));
return true;
},
setKeyCache: function (key, timeout) {
if (!key || !timeout || timeout < new Date().getTime()) return;
var i, len, tmpObj;
//获取当前已经缓存的键值字符串
var oldstr = this.sProxy.getItem(this.keyCache);
var oldMap = [];
//当前key是否已经存在
var flag = false;
var obj = {};
obj.key = key;
obj.timeout = timeout;
if (oldstr) {
oldMap = JSON.parse(oldstr);
if (!_.isArray(oldMap)) oldMap = [];
}
for (i = 0, len = oldMap.length; i < len; i++) {
tmpObj = oldMap[i];
if (tmpObj.key == key) {
oldMap[i] = obj;
flag = true;
break;
}
}
if (!flag) oldMap.push(obj);
//最后将新数组放到缓存中
this.sProxy.setItem(this.keyCache, JSON.stringify(oldMap));
},
buildStorageObj: function (value, indate, timeout, sign) {
var obj = {
value: value,
timeout: timeout,
sign: sign,
indate: indate
};
return obj;
},