ホームページ  >  記事  >  ウェブフロントエンド  >  Angular メソッドレベルのキャッシュ アノテーション (デコレータ)

Angular メソッドレベルのキャッシュ アノテーション (デコレータ)

亚连
亚连オリジナル
2018-05-30 17:30:491369ブラウズ

この記事では主に Angular のメソッドレベルのキャッシュ アノテーション (デコレータ) を紹介します。

es6 ではデコレーターを使用してさまざまなことができます。今日は Angular のデコレーターを使用してメソッド呼び出しをキャッシュする機能を共有します。

アプリケーションのシナリオは次のとおりです。フロントエンドの作業では、頻繁に呼び出されるメソッドがいくつかありますが、これらのメソッドは、ネットワークリクエストやデータ統計関数など、呼び出されるたびに多くのリソースを消費します。これらのメソッドは通常、関数呼び出しで渡されるパラメーターが異なると、異なる結果が返されます。

Springでキャッシュ機能を使ったことがあるので、esにSpringでキャッシュ可能なアノテーションがあれば良いのにと感じています。 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 Vue Projectsでアイコンアイコンを紹介する方法

以上がAngular メソッドレベルのキャッシュ アノテーション (デコレータ)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。