miao-plugin/models/Base.js

90 lines
2.0 KiB
JavaScript
Raw Normal View History

/*
* Base Model
*
* 使用Proxy实现meta数据的getter
* 对Character等可复用设置实例缓存提高性能
* */
2022-08-18 10:13:42 +00:00
import { Data } from '../components/index.js'
2022-03-26 08:21:44 +00:00
let cacheMap = {}
let reFn = {}
let metaMap = {}
2022-03-26 08:21:44 +00:00
export default class Base {
2022-09-10 19:59:45 +00:00
constructor () {
let proxy = new Proxy(this, {
get (self, key, receiver) {
if (self._uuid && key === 'meta') {
return metaMap[self._uuid]
}
2022-09-10 19:59:45 +00:00
if (key in self) {
return Reflect.get(self, key, receiver)
2022-09-10 19:59:45 +00:00
}
if (self._get) {
return self._get.call(receiver, key)
2022-09-10 19:59:45 +00:00
}
if (self._uuid) {
return (metaMap[self._uuid] || {})[key]
} else {
return (self.meta || {})[key]
}
},
set (target, key, newValue) {
if (target._uuid && key === 'meta') {
metaMap[target._uuid] = newValue
return true
} else {
return Reflect.set(target, key, newValue)
}
2022-09-10 19:59:45 +00:00
}
})
return proxy
2022-09-10 19:59:45 +00:00
}
getData (arrList = '', cfg = {}) {
2022-08-18 10:13:42 +00:00
arrList = arrList || this._dataKey || ''
return Data.getData(this, arrList, cfg)
2022-03-26 08:21:44 +00:00
}
// 获取指定值数据,支持通过
getVal (key, defaultValue) {
return Data.getVal(this, key, defaultValue)
2022-03-26 08:21:44 +00:00
}
// 获取缓存
_getCache (uuid = '', time = 10 * 60) {
if (uuid && cacheMap[uuid]) {
return cacheMap[uuid]._expire(time)
}
this._uuid = uuid
}
// 设置缓存
_cache (time = 10 * 60) {
let id = this._uuid
2022-09-10 19:59:45 +00:00
if (id) {
this._expire(time)
cacheMap[id] = this
return cacheMap[id]
}
return this
}
// 设置超时时间
_expire (time = 10 * 60) {
let id = this._uuid
reFn[id] && clearTimeout(reFn[id])
if (time > 0) {
if (id) {
reFn[id] = setTimeout(() => {
reFn[id] && clearTimeout(reFn[id])
delete reFn[id]
delete cacheMap[id]
delete metaMap[id]
}, time * 1000)
}
return cacheMap[id]
}
}
}