增加注释
This commit is contained in:
parent
217a1137da
commit
0006a38c54
|
@ -9,29 +9,49 @@ import { hex_md5 } from "../crypt/md5.js";
|
||||||
export class CacheContext{
|
export class CacheContext{
|
||||||
|
|
||||||
constructor(){
|
constructor(){
|
||||||
this.lib = this.createCacheProxy(Library);
|
this.lib = this._createCacheProxy(Library);
|
||||||
this.game = this.createCacheProxy(Game);
|
this.game = this._createCacheProxy(Game);
|
||||||
this.get = this.createCacheProxy(Get);
|
this.get = this._createCacheProxy(Get);
|
||||||
this.sourceMap = new Map();
|
this.sourceMap = new Map();
|
||||||
this.storageMap = new Map();
|
this.storageMap = new Map();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置当前是否处于缓存环境。当使用inject对类进行注入时,只在缓存环境下会返回缓存值。
|
||||||
|
* @param {boolean} cache
|
||||||
|
*/
|
||||||
static setInCacheEnvironment(cache){
|
static setInCacheEnvironment(cache){
|
||||||
_status.cacheEnvironment = cache;
|
_status.cacheEnvironment = cache;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置一个公有的缓存上下文。缓存上下文持有期间,假设所缓存的函数在参数相同时,绝对不会(注意是绝对不会)返回不同的返回值。
|
||||||
|
* 使用inject对类进行注入时,将应用公有的缓存上下文。
|
||||||
|
* @param {CacheContext} context
|
||||||
|
*/
|
||||||
static setCacheContext(context){
|
static setCacheContext(context){
|
||||||
_status.cacheContext = context;
|
_status.cacheContext = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 返回当前公有的缓存上下文。
|
||||||
|
* @returns {CacheContext} 缓存上下文
|
||||||
|
*/
|
||||||
static getCacheContext(){
|
static getCacheContext(){
|
||||||
return _status.cacheContext;
|
return _status.cacheContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 移除当前公有的缓存上下文。
|
||||||
|
*/
|
||||||
static removeCacheContext(){
|
static removeCacheContext(){
|
||||||
delete _status.cacheContext;
|
delete _status.cacheContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 返回公有的缓存上下文,没有就创建一个新的返回(不会设置为新的公有缓存上下文)。
|
||||||
|
* @returns {CacheContext} 缓存上下文
|
||||||
|
*/
|
||||||
static requireCacheContext(){
|
static requireCacheContext(){
|
||||||
let cache = CacheContext.getCacheContext();
|
let cache = CacheContext.getCacheContext();
|
||||||
if(!cache){
|
if(!cache){
|
||||||
|
@ -40,6 +60,13 @@ export class CacheContext{
|
||||||
return cache;
|
return cache;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对一个对象进行代理,对象的所有函数都将按条件返回缓存结果。
|
||||||
|
* 注意:以cache开头的方法依然保持原来的调用。
|
||||||
|
* 如果所代理的对象拥有cacheSupportFunction方法(返回一个方法名数组),只有允许的方法才会返回缓存结果,剩余方法依然保持原来的调用。
|
||||||
|
* @param {any} source 需要代理的对象
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
delegate(source){
|
delegate(source){
|
||||||
if(source === null || source === undefined)return source;
|
if(source === null || source === undefined)return source;
|
||||||
if(source._cacheDelegateSource)return source;
|
if(source._cacheDelegateSource)return source;
|
||||||
|
@ -47,11 +74,17 @@ export class CacheContext{
|
||||||
if(proxy){
|
if(proxy){
|
||||||
return proxy;
|
return proxy;
|
||||||
}
|
}
|
||||||
proxy = this.createCacheProxy(source);
|
proxy = this._createCacheProxy(source);
|
||||||
this.sourceMap.set(source,proxy);
|
this.sourceMap.set(source,proxy);
|
||||||
return proxy;
|
return proxy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对一个类进行注入。methods为可以返回缓存的所有方法。注入后,此类的相关方法会在公有缓存上下文下返回缓存值。
|
||||||
|
* @param {any} source
|
||||||
|
* @param {Array<string>} methods
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
static inject(source,methods){
|
static inject(source,methods){
|
||||||
if(source == null || source === undefined)return null;
|
if(source == null || source === undefined)return null;
|
||||||
for(let method of methods){
|
for(let method of methods){
|
||||||
|
@ -63,7 +96,7 @@ export class CacheContext{
|
||||||
return func.call(this,...arguments);
|
return func.call(this,...arguments);
|
||||||
}
|
}
|
||||||
return CacheContext
|
return CacheContext
|
||||||
.getCacheValueFromObject(CacheContext.requireCacheContext().requireStorage(this),method,arguments,this,func);
|
._getCacheValueFromObject(CacheContext.requireCacheContext()._requireStorage(this),method,arguments,this,func);
|
||||||
}catch(e){
|
}catch(e){
|
||||||
return func.call(this,...arguments);
|
return func.call(this,...arguments);
|
||||||
}
|
}
|
||||||
|
@ -71,7 +104,7 @@ export class CacheContext{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
requireStorage(obj){
|
_requireStorage(obj){
|
||||||
let storage = this.storageMap.get(obj);
|
let storage = this.storageMap.get(obj);
|
||||||
if(!storage){
|
if(!storage){
|
||||||
storage = {};
|
storage = {};
|
||||||
|
@ -85,7 +118,7 @@ export class CacheContext{
|
||||||
* @param {T} delegateObject
|
* @param {T} delegateObject
|
||||||
* @returns {T}
|
* @returns {T}
|
||||||
*/
|
*/
|
||||||
createCacheProxy(delegateObject){
|
_createCacheProxy(delegateObject){
|
||||||
const cacheFuncObj = {};
|
const cacheFuncObj = {};
|
||||||
const cacheStorage = {};
|
const cacheStorage = {};
|
||||||
return new Proxy(delegateObject,{
|
return new Proxy(delegateObject,{
|
||||||
|
@ -106,7 +139,7 @@ export class CacheContext{
|
||||||
wrapFunc = function(){
|
wrapFunc = function(){
|
||||||
try{
|
try{
|
||||||
return CacheContext
|
return CacheContext
|
||||||
.getCacheValueFromObject(cacheStorage,key,arguments,target);
|
._getCacheValueFromObject(cacheStorage,key,arguments,target);
|
||||||
}catch(e){
|
}catch(e){
|
||||||
return value.call(target,...arguments);
|
return value.call(target,...arguments);
|
||||||
}
|
}
|
||||||
|
@ -120,10 +153,10 @@ export class CacheContext{
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
static getCacheValueFromObject(storage,key,params,source,func){
|
static _getCacheValueFromObject(storage,key,params,source,func){
|
||||||
let cache = storage;
|
let cache = storage;
|
||||||
let funcCache = CacheContext.ensureMember(cache,key);
|
let funcCache = CacheContext._ensureMember(cache,key);
|
||||||
let cacheKey = CacheContext.wrapParametersToCacheKey(params);
|
let cacheKey = CacheContext._wrapParametersToCacheKey(params);
|
||||||
let ret = funcCache[cacheKey];
|
let ret = funcCache[cacheKey];
|
||||||
if(ret === undefined){
|
if(ret === undefined){
|
||||||
ret = ((typeof func == 'function')?func:source[key]).call(source,...params);
|
ret = ((typeof func == 'function')?func:source[key]).call(source,...params);
|
||||||
|
@ -135,7 +168,7 @@ export class CacheContext{
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ensureMember(obj,key){
|
static _ensureMember(obj,key){
|
||||||
let mem = obj[key];
|
let mem = obj[key];
|
||||||
if(!mem){
|
if(!mem){
|
||||||
mem = {};
|
mem = {};
|
||||||
|
@ -144,14 +177,14 @@ export class CacheContext{
|
||||||
return mem;
|
return mem;
|
||||||
}
|
}
|
||||||
|
|
||||||
static wrapParametersToCacheKey(params){
|
static _wrapParametersToCacheKey(params){
|
||||||
return Array.from(params)
|
return Array.from(params)
|
||||||
.filter(p=>!(p instanceof CacheContext))
|
.filter(p=>!(p instanceof CacheContext))
|
||||||
.map(param=>CacheContext.wrapParameterToCacheKey(param))
|
.map(param=>CacheContext._wrapParameterToCacheKey(param))
|
||||||
.join('-');
|
.join('-');
|
||||||
}
|
}
|
||||||
|
|
||||||
static wrapParameterToCacheKey(param){
|
static _wrapParameterToCacheKey(param){
|
||||||
if(param === null)return 'null';
|
if(param === null)return 'null';
|
||||||
if(param === undefined)return 'undefined';
|
if(param === undefined)return 'undefined';
|
||||||
if(typeof param === 'string')return `[str:${param}]`;
|
if(typeof param === 'string')return `[str:${param}]`;
|
||||||
|
@ -159,11 +192,11 @@ export class CacheContext{
|
||||||
if(typeof param === 'boolean')return `[bl:${param}]`;
|
if(typeof param === 'boolean')return `[bl:${param}]`;
|
||||||
if(typeof param.getCacheKey == 'function')return param.getCacheKey();
|
if(typeof param.getCacheKey == 'function')return param.getCacheKey();
|
||||||
if(Array.isArray(param)){
|
if(Array.isArray(param)){
|
||||||
return `[arr:[${param.filter(p=>!(p instanceof CacheContext)).map(p=>CacheContext.wrapParameterToCacheKey(p)).join('-')}]]`;
|
return `[arr:[${param.filter(p=>!(p instanceof CacheContext)).map(p=>CacheContext._wrapParameterToCacheKey(p)).join('-')}]]`;
|
||||||
}
|
}
|
||||||
if(typeof param === 'function')return `[f:${hex_md5(param.toString())}]`;
|
if(typeof param === 'function')return `[f:${hex_md5(param.toString())}]`;
|
||||||
let entries = Object.entries(param);
|
let entries = Object.entries(param);
|
||||||
entries.sort((a,b)=>a[0]<b[0]?-1:1);
|
entries.sort((a,b)=>a[0]<b[0]?-1:1);
|
||||||
return `[obj:{${entries.map(e=>e[0]+":"+CacheContext.wrapParameterToCacheKey(e[1])).join(',')}}]`;
|
return `[obj:{${entries.map(e=>e[0]+":"+CacheContext._wrapParameterToCacheKey(e[1])).join(',')}}]`;
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue