一种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 相关文章推荐
window.onload 加载完毕的问题及解决方案(上)
Jul 09 Javascript
js获取当前地址 JS获取当前URL的示例代码
Feb 26 Javascript
JavaScript中的Math.sin()方法使用详解
Jun 15 Javascript
js实现跨域访问的三种方法
Dec 09 Javascript
浅谈EasyUI常用控件的禁用方法
Nov 09 Javascript
BootStrap中关于Select下拉框选择触发事件及扩展
Nov 22 Javascript
详解能在多种前端框架下使用的表格控件
Jan 11 Javascript
vue组件中使用iframe元素的示例代码
Dec 13 Javascript
vue-cli监听组件加载完成的方法
Sep 07 Javascript
vue实现百度下拉列表交互操作示例
Mar 12 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
Sep 27 Javascript
js实现简易计算器功能
Oct 18 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
咖啡的植物学知识
2021/03/03 咖啡文化
Linux下编译redis和phpredis的方法
2016/04/07 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
javascript中substr,substring,slice.splice的区别说明
2010/11/25 Javascript
jquery ajax属性async(同步异步)示例
2013/11/05 Javascript
javascript:void(0)的问题使用探讨
2014/04/10 Javascript
node.js中使用socket.io制作命名空间
2014/12/15 Javascript
jQuery中:contains选择器用法实例
2014/12/30 Javascript
jquery操作select元素和option的实例代码
2016/02/03 Javascript
JS 事件绑定、事件监听、事件委托详细介绍
2016/09/28 Javascript
借助node实战JSONP跨域实例
2017/03/30 Javascript
利用Node.js如何实现文件循环覆写
2019/04/05 Javascript
[42:32]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第二场 10.28
2020/10/28 DOTA
Python通过future处理并发问题
2017/10/17 Python
Tornado 多进程实现分析详解
2018/01/12 Python
python 二维数组90度旋转的方法
2019/01/28 Python
使用Python+selenium实现第一个自动化测试脚本
2020/03/17 Python
python中round函数如何使用
2020/06/19 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
2020/11/24 Python
德国50岁以上交友网站:Lebensfreunde
2020/03/18 全球购物
初中三年学生的学习自我评价
2013/11/13 职场文书
会计电算化专业毕业生自荐信
2013/12/20 职场文书
商业活动邀请函
2014/02/04 职场文书
关爱留守儿童倡议书
2014/04/15 职场文书
感恩之星事迹材料
2014/05/03 职场文书
国旗下演讲稿
2014/05/08 职场文书
文明礼貌演讲稿
2014/05/12 职场文书
厕所文明标语
2014/06/11 职场文书
禁止高声喧哗的标语
2014/06/11 职场文书
连锁超市项目计划书
2014/09/15 职场文书
2014年人民警察入党思想汇报
2014/10/12 职场文书
2015年生产车间工作总结
2015/04/22 职场文书
基层医务人员三严三实心得体会
2016/01/05 职场文书
react国际化react-intl的使用
2021/05/06 Javascript
Python 中random 库的详细使用
2021/06/03 Python
入门学习Go的基本语法
2021/07/07 Golang