本篇文章主要介紹了一種angular的方法級的緩存註解(裝飾器),現在分享給大家,也給大家做個參考。
使用es6中裝裝飾器能做很多事情,今天就分享一種在angular使用裝飾器進行方法呼叫快取的功能。
應用場景是這樣的,在前端工作中,會有一些經常使用的方法經常被調用,但是這些方法每次調用都會佔用很多的資源,比如網絡請求,數據統計功能,這些方法一般會隨著函數呼叫傳參的不同返回的結果不同。
因為使用過spring中的cache功能,感覺es中如果有spring cacheable註解就好了,在spring中註解使用如下:
@Cacheable(value="'accountCache_'+#userName")// 缓存名叫 accountCache_USERNAME public Account getAccountByName(String userName) { // @@@@ return acount; }
#spring中的快取時間是在設定檔中配置的,但是在前端一般我們需要針對不同的函數設定不同的快取時間
因此需要每次指定對應的快取時間
@cacheable(111) getSecondLeftMenu(topMenuId: number){ return 1111; }
於是我搞了一個支援回傳是Promise物件的快取註解
export function cacheable(timeout:number) { return function (target: any, key: string, descriptor: any) { const originalMethod = descriptor.value; descriptor.value = function (...args: any[]) { //把传入的参数和被调的函数名一起组成存储的主键 const paramStr = args.map(a => JSON.stringify(a)).join(); const keyStr=key+"start$$"+(paramStr||"")+"-$$end"; let resultStr=localStorage.getItem(keyStr); if (!!resultStr) { let resultValue=JSON.parse(resultStr); let now=new Date() as any; //把缓存时的时间和当前的时间进行对比,如果没有超时,则直接返回 let old2=(new Date(resultValue.date)) as any; let delt=now - old2; if (delt<(timeout*1000)) { return Promise.resolve(resultValue.value); } } //超时时,调用原方法,并记录返回结果,这里我们的返回均是promise对象 var result = originalMethod.apply(this, args); result.then(data=>{ let dd={ date:new Date(), value:data } localStorage.setItem(keyStr,JSON.stringify(dd)) return Promise.resolve(data); },data=>{ return Promise.reject(data); }) return result; } return descriptor; } }
上面是我整理給大家的,希望今後對大家有幫助。
相關文章:
以上是一種angular的方法級的緩存註解(裝飾器)的詳細內容。更多資訊請關注PHP中文網其他相關文章!