一种angular的方法级的缓存注解(装饰器)


Posted in Javascript onMarch 13, 2018

使用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;
    }
}

上述的代码中,我们重点实现了返回值是Promise对象的函数,因为在前端工作中,最占用资源和需要缓存的是网络请求,而且也极易影响用户的体验,因此我们重点关心了返回值是Promise的注解。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript css styleFloat和cssFloat
Mar 15 Javascript
几个有趣的Javascript Hack
Jul 24 Javascript
javascript学习基础笔记之DOM对象操作
Nov 03 Javascript
关于JS判断图片是否加载完成且获取图片宽度的方法
Apr 09 Javascript
jquery 全选、全不选、反选效果的实现代码【推荐】
May 05 Javascript
深入理解jQuery之事件移除
Jun 02 Javascript
request请求获取参数的实现方法(post和get两种方式)
Sep 27 Javascript
js控制按钮,防止频繁点击响应的实例
Feb 15 Javascript
详谈jQuery.load()和Jsp的include的区别
Apr 12 jQuery
node 利用进程通信实现Cluster共享内存
Oct 27 Javascript
vue实现微信二次分享以及自定义分享的示例
Mar 20 Javascript
vue仿ios列表左划删除
Sep 26 Javascript
vue 多入口文件搭建 vue多页面搭建的实例讲解
Mar 12 #Javascript
解决vue多个路由共用一个页面的问题
Mar 12 #Javascript
angular5 httpclient的示例实战
Mar 12 #Javascript
vue 简单自动补全的输入框的示例
Mar 12 #Javascript
webpack打包js的方法
Mar 12 #Javascript
AngularJS对动态增加的DOM实现ng-keyup事件示例
Mar 12 #Javascript
vue路由懒加载的实现方法
Mar 12 #Javascript
You might like
PHP下通过系统信号量加锁方式获取递增序列ID
2009/09/25 PHP
浅析php header 跳转
2013/06/17 PHP
php微信开发之上传临时素材
2016/06/24 PHP
PHP加密技术的简单实现
2016/09/04 PHP
PHP递归删除多维数组中的某个值
2017/04/17 PHP
thinkphp5 模型实例化获得数据对象的教程
2019/10/18 PHP
php中get_object_vars()在数组的实例用法
2021/02/22 PHP
Javascript+XMLHttpRequest+asp.net无刷新读取数据库数据
2009/08/09 Javascript
解决Extjs 4 Panel作为Window组件的子组件时出现双重边框问题
2013/01/11 Javascript
利用NodeJS和PhantomJS抓取网站页面信息以及网站截图
2013/11/18 NodeJs
js抽奖实现随机抽奖代码效果
2013/12/02 Javascript
nodejs初步体验篇
2015/11/23 NodeJs
JS实现部分HTML固定页面顶部随屏滚动效果
2015/12/24 Javascript
JavaScript简单获取系统当前时间完整示例
2016/08/02 Javascript
JavaScript实现反转字符串的方法详解
2017/04/27 Javascript
在 Typescript 中使用可被复用的 Vue Mixin功能
2018/04/17 Javascript
vue cli 3.0 使用全过程解析
2018/06/14 Javascript
简述vue状态管理模式之vuex
2018/08/29 Javascript
vue使用rem实现 移动端屏幕适配
2018/09/26 Javascript
使用taro开发微信小程序遇到的坑总结
2019/04/08 Javascript
基于Angular 8和Bootstrap 4实现动态主题切换的示例代码
2020/02/11 Javascript
发布你的Python模块详解
2016/09/15 Python
python绘制热力图heatmap
2020/03/23 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
2019/05/27 Python
Pycharm远程调试原理及具体配置详解
2019/08/08 Python
Python dict的常用方法示例代码
2020/06/23 Python
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
纯CSS3实现8组超炫酷鼠标滑过图片动画
2016/03/16 HTML / CSS
Css3新特性应用之形状总结
2016/12/08 HTML / CSS
HTML5 通信API 跨域门槛将不再高、数据推送也不再是梦
2013/04/25 HTML / CSS
HTML5语音识别标签写法附图
2013/11/18 HTML / CSS
美国知名的时尚购物网站:Anthropologie
2016/12/22 全球购物
AT&T Wireless:手机、无限数据计划和配件
2018/06/03 全球购物
中班幼儿评语大全
2014/04/30 职场文书
绿色出行口号
2014/06/18 职场文书
python munch库的使用解析
2021/05/25 Python