首頁  >  文章  >  web前端  >  一種angular的方法級的緩存註解(裝飾器)

一種angular的方法級的緩存註解(裝飾器)

亚连
亚连原創
2018-05-30 17:30:491423瀏覽

本篇文章主要介紹了一種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;
    }
}

上面是我整理給大家的,希望今後對大家有幫助。

相關文章:

Vue專案中如何引入icon圖示

#JavaScript中的E-mail 位址格式驗證

javascript效能最佳化之分時函數的介紹

以上是一種angular的方法級的緩存註解(裝飾器)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn