一种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 构造函数 面相对象学习必备知识
Jun 09 Javascript
event.currentTarget与event.target的区别介绍
Dec 31 Javascript
javascript重写alert方法的实例代码
Mar 29 Javascript
javascript类型转换示例
Apr 29 Javascript
javascript中的__defineGetter__和__defineSetter__介绍
Aug 15 Javascript
JS中动态创建元素的三种方法总结(推荐)
Oct 20 Javascript
浅谈jQuery this和$(this)的区别及获取$(this)子元素对象的方法
Nov 29 Javascript
巧用数组制作图片切换js代码
Nov 29 Javascript
CodeMirror js代码加亮使用总结
Mar 25 Javascript
微信小程序实现缓存根据不同的id来进行设置和读取缓存
Jun 12 Javascript
利用JS对iframe父子(内外)页面进行操作的方法教程
Jun 15 Javascript
在vue中实现禁止屏幕滚动,禁止屏幕滑动
Jul 22 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
PHP7.0安装笔记整理
2015/08/28 PHP
PHP实现上一篇下一篇的方法实例总结
2016/09/22 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
2017/05/26 PHP
用原生JavaScript实现jQuery的$.getJSON的解决方法
2013/05/03 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
2014/06/24 Javascript
jQuery实现页面倒计时并刷新效果
2017/03/13 Javascript
validationEngine 表单验证插件使用实例代码
2017/06/15 Javascript
详解Vue.js之视图和数据的双向绑定(v-model)
2017/06/23 Javascript
Vue中如何实现轮播图的示例代码
2017/07/27 Javascript
Express下采用bcryptjs进行密码加密的方法
2018/02/07 Javascript
angularJs在多个控制器中共享服务数据的方法
2018/09/30 Javascript
vue-mugen-scroll组件实现pc端滚动刷新
2019/08/16 Javascript
jquery 插件重新绑定的处理方法分析
2019/11/23 jQuery
Vue中keep-alive组件作用详解
2020/02/04 Javascript
JavaScript接口实现方法实例分析
2020/05/16 Javascript
JavaScript设计模式--简单工厂模式实例分析【XHR工厂案例】
2020/05/23 Javascript
简单了解JavaScript arguement原理及作用
2020/05/28 Javascript
解决vue watch数据的方法被调用了两次的问题
2020/11/07 Javascript
vue的hash值原理也是table切换实例代码
2020/12/14 Vue.js
python在命令行下使用google翻译(带语音)
2014/01/16 Python
Python中字典(dict)和列表(list)的排序方法实例
2014/06/16 Python
Python入门篇之函数
2014/10/20 Python
使用Python的urllib2模块处理url和图片的技巧两则
2016/02/18 Python
Python动态赋值的陷阱知识点总结
2019/03/17 Python
Tensorflow实现酸奶销量预测分析
2019/07/19 Python
wxpython多线程防假死与线程间传递消息实例详解
2019/12/13 Python
导出HTML5 Canvas图片并上传服务器功能
2019/08/16 HTML / CSS
英国大码女性时装零售商:Evans
2018/08/29 全球购物
eDreams意大利:南欧领先的在线旅行社
2018/11/23 全球购物
英国最大的自有市场,比亚马逊便宜:Flubit
2019/03/19 全球购物
打架检讨书500字
2014/01/29 职场文书
差生评语大全
2014/05/04 职场文书
经管应届生求职信范文
2014/05/18 职场文书
2014年行政后勤工作总结
2014/12/06 职场文书
SQL Server #{}可以防止SQL注入
2022/05/11 SQL Server
mysql序号rownum行号实现方式
2022/12/24 MySQL