この記事では主に 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 サイトの他の関連記事を参照してください。