一种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 相关文章推荐
Z-Blog中用到的js代码
Mar 15 Javascript
DWZ table的原生分页浅谈
Mar 01 Javascript
Javascript WebSocket使用实例介绍(简明入门教程)
Apr 16 Javascript
js中取得变量绝对值的方法
Jan 03 Javascript
javascript实现详细时间提醒信息效果的方法
Mar 11 Javascript
简单对比分析JavaScript中的apply,call与this的使用
Dec 04 Javascript
详解vue项目中如何引入全局sass/less变量、function、mixin
Jun 02 Javascript
页面内锚点定位及跳转方法总结(推荐)
Apr 24 Javascript
基于vue实现一个神奇的动态按钮效果
May 15 Javascript
Vue的属性、方法、生命周期实例代码详解
Sep 17 Javascript
为nuxt项目写一个面包屑cli工具实现自动生成页面与面包屑配置
Sep 29 Javascript
微信小程序选择图片控件
Jan 19 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
windows8.1下Apache+Php+MySQL配置步骤
2015/10/30 PHP
php 5.4 全新的代码复用Trait详解
2017/01/05 PHP
js innerHTML 的一些问题的解决方法
2008/06/22 Javascript
javascript对select标签的控制(option选项/select)
2013/01/31 Javascript
如何在JavaScript中实现私有属性的写类方式(二)
2013/12/04 Javascript
jquery动态添加option示例
2013/12/30 Javascript
js离开或刷新页面检测(且兼容FF,IE,Chrome)
2014/03/05 Javascript
js对字符的验证方法汇总
2015/02/04 Javascript
JavaScript和JQuery的鼠标mouse事件冒泡处理
2015/06/19 Javascript
JS给Textarea文本框添加行号的方法
2015/08/20 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
2015/10/16 Javascript
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
js内置对象处理_打印学生成绩单的简单实现
2016/09/24 Javascript
JS命令模式例子之菜单程序
2016/10/10 Javascript
微信小程序 Nginx环境配置详细介绍
2017/02/14 Javascript
Angular利用trackBy提升性能的方法
2018/01/26 Javascript
iView框架问题整理小结
2018/10/16 Javascript
JavaScript偏函数与柯里化实例详解
2019/03/27 Javascript
JS实现选项卡效果的代码实例
2019/05/20 Javascript
Jquery使用each函数实现遍历及数组处理
2020/07/14 jQuery
python 将数据保存为excel的xls格式(实例讲解)
2018/05/03 Python
Python爬虫框架scrapy实现的文件下载功能示例
2018/08/04 Python
python 实现selenium断言和验证的方法
2019/02/13 Python
Python字符串对象实现原理详解
2019/07/01 Python
Django 过滤器汇总及自定义过滤器使用详解
2019/07/19 Python
Python列表元素常见操作简单示例
2019/10/25 Python
解决Tensorflow占用GPU显存问题
2020/02/03 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
2020/03/10 Python
Python3-异步进程回调函数(callback())介绍
2020/05/02 Python
python音频处理的示例详解
2020/12/23 Python
西班牙第一的网上药房:PromoFarma.com
2017/04/17 全球购物
Hoover胡佛官网:美国吸尘器和洗地机品牌
2019/01/09 全球购物
4s客服专员岗位职责
2013/12/01 职场文书
2016年度先进班组事迹材料
2016/03/01 职场文书
导游词之北京明十三陵
2019/10/28 职场文书
CSS3中Animation实现简单的手指点击动画的示例
2021/07/15 HTML / CSS