store.js的使用

基于store.js实现localStorage缓存过期策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
"use strict"
;(function(s) {

/**
* 判断是否支持localStorage本地存储
*/
if (!s.enabled) {
console.error('localStorage is not supported by your browser.')
return;
}

/**
* 规定日期格式
* 比如:yyyy年MM月dd日 HH:mm:ss S、yyyy-MM-dd HH:mm:ss S......
*/
function _checkFormat(fmt) {
if (!/^y+[\u5e74-]?M+[\u6708-]?(d+)[\u65e5]? H+[\u65f6:]?m+[\u5206:]?s+[\u79d2]?(( S)?)$/.test(fmt)) {
throw new Error('"' + fmt + '" is not supported by the format.');
return false;
}
return true;
}

/**
* 时间格式化:时间毫秒数、Date对象 ---> 时间字符串 默认格式化格式:yyyy-MM-dd HH:mm:ss
*/
function _date2str(str, fmt) {
if (fmt === undefined) {
fmt = 'yyyy-MM-dd HH:mm:ss';
}
_checkFormat(fmt);
var date;
if (typeof str === 'number') {
date = new Date(str);
} else if (_isValidDate(str)) {
date = str;
}
var o = {
'M+' : date.getMonth() + 1, // 月
'd+' : date.getDate(), // 日
'H+' : date.getHours(), // 小时(24小时制)
'm+' : date.getMinutes(), // 分
's+' : date.getSeconds(), // 秒
'S' : date.getMilliseconds() // 毫秒
};
if (/(y+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '')
.substr(4 - RegExp.$1.length));
}
for ( var k in o) {
if (new RegExp('(' + k + ')').test(fmt)) {
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k])
: (('00' + o[k]).substr(('' + o[k]).length)));
}
}
return fmt;
}

/**
* 时间格式化:将时间字符串 ---> Date对象 默认格式化格式:yyyy-MM-dd HH:mm:ss,使用中文不能格式化
*/
function _str2date(str, fmt) {
if (fmt === undefined) {
fmt = 'yyyy-MM-dd HH:mm:ss';
}
_checkFormat(fmt);
var o = [
'y+', // 年
'M+', // 月
'd+', // 日
'H+', // 小时(24小时制)
'm+', // 分
's+', // 秒
'S' // 毫秒
];
var date = new Date();
for (var k = 0; k < o.length; k++) {
var s = o[k];
if (new RegExp('(' + s + ')').test(fmt)) {
var r = RegExp.$1;
var rl = RegExp.$1.length;
var si = fmt.indexOf(RegExp.$1);
var ei = si + rl;
var n = 0;
if (r.indexOf('S') > -1) {
n = parseInt(str.substr(si));
date.setMilliseconds(n); // 设置 Date 对象中的毫秒 (0 ~ 999)。
} else {
n = parseInt(str.substring(si, ei));
if (r.indexOf('y') > -1) {
date.setFullYear(n); // 设置 Date 对象中的年份(四位数字)。
} else if (r.indexOf('M') > -1) {
date.setMonth(n - 1); // 设置 Date 对象中月份 (0 ~ 11)。
} else if (r.indexOf('d') > -1) {
date.setDate(n); // 设置 Date 对象中月的某一天 (1 ~ 31)。
} else if (r.indexOf('H') > -1) {
date.setHours(n); // 设置 Date 对象中的小时 (0 ~ 23)。
} else if (r.indexOf('m') > -1) {
date.setMinutes(n); // 设置 Date 对象中的分钟 (0 ~ 59)。
} else if (r.indexOf('s') > -1) {
date.setSeconds(n); // 设置 Date 对象中的秒钟 (0 ~ 59)。
}
}
}
}
return date;
}

/**
* 转换:毫秒 ---> 天时分秒毫秒
*/
function _ms2s(ms) {
var s = parseInt(ms / 1000);// 秒
var m = 0;// 分
var h = 0;// 小时
var d = 0;// 天
if (s >= 60) {
m = parseInt(s / 60);
s = parseInt(s % 60);
if (m >= 60) {
h = parseInt(m / 60);
m = parseInt(m % 60);
if (h >= 24) {
d = parseInt(h / 24);
h = parseInt(h % 24);
}
}
}
var str = '';
if (s > 0)
str = '' + parseInt(s) + '\u79d2' + str;
if (m > 0)
str = '' + parseInt(m) + '\u5206' + str;
if (h > 0)
str = '' + parseInt(h) + '\u5c0f\u65f6' + str;
if (d > 0)
str = '' + parseInt(d) + '\u5929' + str;
return str;
}

/**
* 设置有效时间,返回对象
*/
function VConstructor(val, exp) {
var item = {};
// 创建时间、有效时间
var createTime = (new Date()).getTime(), effectiveTime;
if (typeof exp === 'number') {
effectiveTime = new Date(createTime + exp * 60000);
} else if (typeof exp === 'string') {
effectiveTime = _str2date(exp);
}
if (effectiveTime && !_isValidDate(effectiveTime)) {
throw new Error('effectiveTime cannot be converted to a valid Date instance');
}
effectiveTime = effectiveTime.getTime();
item['c'] = _date2str(createTime);
item['e'] = _date2str(effectiveTime);
item['t'] = _ms2s(effectiveTime - createTime);
item['v'] = val;
return item;
}

/**
* 判断是否是Date对象
*/
function _isValidDate(date) {
return Object.prototype.toString.call(date) === '[object Date]'
&& !isNaN(date.getTime());
}

/**
* 判断是否设置了有效时间
*/
function _hasEffective(item) {
if (item) {
if (typeof item === 'object' && 'c' in item && 'e' in item
&& 'v' in item) {
return true;
}
}
return false;
}

/**
* 判断是否是有效
*/
function _isEffective(item) {
var ntime = (new Date()).getTime();
return ntime < _str2date(item.e);
}

/**
* 判断key是否是字符串,如果不是,则转换成字符串
*/
function _keyAsString(key) {
if (typeof key !== 'string') {
console.warn(key + ' used as a key, but it is not a string.');
key = String(key);
}
return key;
}

/**
* exp 失效时间:默认为0(单位:分钟)
*/
s.setExp = function(key, val, exp) {
key = _keyAsString(key);
if (exp === undefined) {
exp = 0;
}
s.set(key, new VConstructor(val, exp));
};
s.getExp = function(key) {
key = _keyAsString(key);
var item = null;
try {
item = s.get(key);
} catch (e) {
return null;
}
if (_hasEffective(item)) {
if (_isEffective(item)) {
return item.v;
} else {
s.remove(key);
return null;
}
} else {
return item;
}
};
s.getAllExp = function() {
var ret = {};
s.forEachExp(function(key, val) {
ret[key] = val;
})
return ret;
};
s.forEachExp = function(callback) {
var storage = s.getAll();
for ( var key in storage) {
callback(key, s.getExp(key));
}
};
})(store);
  • 本文作者: forever杨
  • 本文链接: https://blog.yl-online.top/posts/78a81828.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。如果文章内容对你有用,请记录到你的笔记中。本博客站点随时会停止服务,请不要收藏、转载!