一种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 相关文章推荐
用 JSON 处理缓存
Apr 27 Javascript
javascript中的几个运算符
Jun 29 Javascript
20款效果非常棒的 jQuery 插件小结分享
Nov 18 Javascript
js用Date对象的setDate()函数对日期进行加减操作
Sep 18 Javascript
javascript实现瀑布流自适应遇到的问题及解决方案
Jan 28 Javascript
Jquery实现弹性滑块滑动选择数值插件
Aug 08 Javascript
jQueryUI DatePicker 添加时分秒
Jun 04 Javascript
node.js报错:Cannot find module 'ejs'的解决办法
Dec 14 Javascript
JS查找英文文章中出现频率最高的单词
Mar 20 Javascript
详解Node中导入模块require和import的区别
Aug 11 Javascript
vue升级之路之vue-router的使用教程
Aug 14 Javascript
JavaScript函数定义方法实例详解
Mar 05 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日期处理函数 整型日期格式
2011/01/12 PHP
ThinkPHP Mobile使用方法简明教程
2014/06/18 PHP
CI框架集成Smarty的方法分析
2016/05/17 PHP
PHP设计模式之装饰器模式实例详解
2018/02/07 PHP
PHP设计模式之组合模式定义与应用示例
2020/02/01 PHP
在JavaScript里嵌入大量字符串常量的实现方法
2013/07/07 Javascript
JavaScript中window、doucment、body的解释
2013/08/14 Javascript
使用百度地图api实现根据地址查询经纬度
2014/12/11 Javascript
JavaScript中的setMilliseconds()方法使用详解
2015/06/11 Javascript
Node.js如何自动审核团队的代码
2016/07/20 Javascript
js中scrollTop()方法和scroll()方法用法示例
2016/10/03 Javascript
手机浏览器 后退按钮强制刷新页面方法总结
2016/10/09 Javascript
Bootstrap3下拉菜单的实现
2017/02/22 Javascript
基于Bootstrap table组件实现多层表头的实例代码
2017/09/07 Javascript
详细分析单线程JS执行问题
2017/11/22 Javascript
vue-cli+webpack项目 修改项目名称的方法
2018/02/28 Javascript
移动端底部导航固定配合vue-router实现组件切换功能
2019/06/13 Javascript
浅谈vue单页面中有多个echarts图表时的公用代码写法
2020/07/19 Javascript
Python-while 计算100以内奇数和的方法
2019/06/11 Python
TensorFlow2.0:张量的合并与分割实例
2020/01/19 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
2020/04/21 Python
Java ExcutorService优雅关闭方式解析
2020/05/30 Python
python产生模拟数据faker库的使用详解
2020/11/04 Python
详解python的变量缓存机制
2021/01/24 Python
CSS3实现自定义Checkbox特效实例代码
2017/04/24 HTML / CSS
做一个能自适应高度的textarea的示例代码
2019/09/06 HTML / CSS
草莓网化妆品日本站:Strawberrynet日本
2017/10/20 全球购物
eBay瑞士购物网站:eBay.ch
2018/12/24 全球购物
领班岗位职责范文
2014/02/06 职场文书
小学一年级学生评语
2014/04/22 职场文书
初中新生军训方案
2014/05/13 职场文书
2015年感恩母亲节活动方案
2015/05/04 职场文书
公司仓库管理制度
2015/08/04 职场文书
Python insert() / append() 用法 Leetcode实战演示
2021/03/31 Python
Spring Bean是如何初始化的详解
2022/03/22 Java/Android
Python批量解压&压缩文件夹的示例代码
2022/04/04 Python