cashier_wx/framework/8-cache.js

226 lines
4.2 KiB
JavaScript

/**
* 获取缓存
* @author NanQi
* @param {String} key 缓存键
* @return {String} 缓存值
*/
function get(key) {
try {
let res = uni.getStorageSync(key)
if (!res) {
return ''
}
// res = JSON.parse(res)
if (res.__expiretime && res.__expiretime < uni.utils.timestamp()) {
remove(key)
return ''
} else {
try {
const parsed = JSON.parse(res);
C
} catch (e) {
return res
}
// // #ifdef H5
// try {
// const parsed = JSON.parse(res);
// return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed) ? parsed : ''
// } catch (e) {
// return res
// }
// // #endif
// // #ifndef H5
// return res
// // #endif
}
} catch (e) {
return ''
}
}
/**
* 获取StorageData缓存
* @author NanQi
* @param {String} key 缓存键
* @return {String} 缓存值
*/
function getStorageData(key) {
try {
let res = uni.getStorageSync(key);
if (!res) {
return ''
}
res = JSON.parse(res)
return res.data
} catch (e) {
return ''
}
}
/**
* 设置缓存
* @author NanQi
* @param {String} key 缓存键
* @param {String} value 缓存值
* @param {Number} expire 指定秒数后过期
* @return void
*/
function set(key, value, expire = uni.conf.default_expire) {
let cacheItem = {}
cacheItem = value
// console.log(cacheItem)
// if (expire > 0) {
// cacheItem.__expiretime = uni.utils.timestamp() + expire
// }
// // #ifdef H5
// uni.setStorageSync(key, JSON.stringify(cacheItem))
// // #endif
// // #ifndef H5
// uni.setStorageSync(key, cacheItem)
// // #endif
uni.setStorageSync(key, JSON.stringify(cacheItem))
// uni.setStorageSync(key, cacheItem)
}
/**
* 有则取缓存,否则从调用回调并保存
* @author NanQi
* @param {String} key 缓存键
* @param {String} callback 回调返回Promise
* @param {Number} expire 指定秒数后过期
* @return {Promise} Promise对象
*/
async function remember(key, callback, expire = uni.conf.default_expire) {
let ret = this.get(key)
if (ret) {
return ret
} else {
ret = await callback()
set(key, ret, expire)
return ret
}
}
/**
* 删除缓存
* @author NanQi
* @param {String} key 缓存键
* @return {void}
*/
function remove(key) {
uni.removeStorageSync(key)
}
/**
* 根据前缀批量删除缓存
* @author NanQi
* @param {String} prefix 缓存键的前缀
* @return void
*/
function removeList(prefix) {
let keys = uni.getStorageInfoSync().keys
if (keys && keys.length > 0) {
keys.forEach(key => {
if (key.indexOf(prefix) === 0) {
uni.removeStorageSync(key)
}
})
}
}
function _randomRemove() {
const info = uni.getStorageInfoSync()
if (info.currentSize > 0.7 * info.limitSize ||
info.keys.length > uni.conf.autoRemoveCache.count ||
info.currentSize > uni.conf.autoRemoveCache.size) {
for (let i = 0; i < 100; i++) {
if (info.keys.length < 1) {
return
}
const key = info.keys[Math.floor(Math.random() * info.keys.length)]
_removeExpired(key)
}
}
}
function _removeExpired(key) {
let res = uni.getStorageSync(key);
if (!res) {
return
}
res = JSON.parse(res)
if (res.__expiretime && res.__expiretime < uni.utils.timestamp()) {
remove(key)
}
}
function _autoRemoveExpired() {
const info = uni.getStorageInfoSync()
if (info.currentSize > 0.7 * info.limitSize ||
info.keys.length > uni.conf.autoRemoveCache.count ||
info.currentSize > uni.conf.autoRemoveCache.size) {
if (info.keys && info.keys.length > 0) {
info.keys.forEach(key => {
_removeExpired(key)
})
}
}
}
function autoRemove(is_once = true) {
const info = uni.getStorageInfoSync()
if (info.currentSize > 0.9 * info.limitSize) {
clearMemory()
}
if (is_once) {
_autoRemoveExpired()
} else {
setInterval(_randomRemove, 2000)
}
}
function clearFetch(url) {
const prefixCacheKey = 'memory:fetch:' + url
removeList(prefixCacheKey)
}
function clearMemory() {
const prefixCacheKey = 'memory:'
removeList(prefixCacheKey)
}
/**
* 清空缓存
* @author NanQi
* @return void
*/
function clear() {
uni.clearStorageSync()
}
function getInfo() {
return uni.getStorageInfoSync()
}
uni.cache = {
get,
getStorageData,
set,
remove,
remember,
clearFetch,
clearMemory,
clear,
getInfo,
autoRemove,
}