一种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 封装Ajax传递的数据代码
Jun 05 Javascript
Javascript中引用示例介绍
Feb 21 Javascript
Javascript让DEDECMS告别手写Tag
Sep 01 Javascript
Javascript中call与apply的学习笔记
Sep 22 Javascript
jQuery实现点击该行即可删除HTML表格行
Oct 17 Javascript
webpack+vue.js快速入门教程
Oct 12 Javascript
BootStrap3中模态对话框的使用
Jan 06 Javascript
jQuery插件ContextMenu自定义图标
Mar 15 Javascript
基于vue的fullpage.js单页滚动插件
Mar 20 Javascript
使用Vue开发一个实时性时间转换指令
Jan 17 Javascript
vue写一个组件
Apr 09 Javascript
js中的this的指向问题详解
Aug 29 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学习笔记 IIS7下安装配置php环境
2012/10/29 PHP
php 无法加载mcrypt.dll的解决办法
2013/04/03 PHP
php实现在线生成条形码示例分享(条形码生成器)
2013/12/30 PHP
载入进度条 效果
2006/07/08 Javascript
JavaScript进阶教程(第四课第一部分)
2007/04/05 Javascript
用ASP将SQL搜索出来的内容导出为TXT的代码
2007/07/27 Javascript
JavaScript实现在数组中查找不同顺序排列的字符串
2014/09/26 Javascript
深入探密Javascript数组方法
2015/01/08 Javascript
jQuery学习笔记之基础中的基础
2015/01/19 Javascript
浅谈JavaScript异常处理语句
2015/06/26 Javascript
angularjs利用directive实现移动端自定义软键盘的示例
2017/09/20 Javascript
node.js中http模块和url模块的简单介绍
2017/10/06 Javascript
JavaScript面试出现频繁的一些易错点整理
2018/03/29 Javascript
Angular使用动态加载组件方法实现Dialog的示例
2018/05/11 Javascript
js中获取URL参数的共用方法getRequest()方法实例详解
2018/10/24 Javascript
js对象数组和对象的使用实例详解
2019/08/27 Javascript
vantUI 获得piker选中值的自定义ID操作
2020/11/04 Javascript
[03:42]2014DOTA2国际邀请赛 第三日比赛排位扑朔迷离
2014/07/12 DOTA
[01:38]DOTA2辉夜杯 欢乐的观众现场采访
2015/12/26 DOTA
Python实现二维有序数组查找的方法
2016/04/27 Python
Tensorflow之构建自己的图片数据集TFrecords的方法
2018/02/07 Python
python远程连接MySQL数据库
2019/04/19 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
2020/06/18 Python
keras的三种模型实现与区别说明
2020/07/03 Python
Django实现随机图形验证码的示例
2020/10/15 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
2020/12/16 Python
html5用video标签流式加载的实现
2020/05/20 HTML / CSS
英国领先的独立酒精饮料零售商:DrinkSupermarket
2021/01/13 全球购物
专科毕业生就业推荐信
2013/11/01 职场文书
小学亲子活动总结
2014/07/01 职场文书
代理词怎么写
2015/05/25 职场文书
秋收起义观后感
2015/06/11 职场文书
小学开学典礼新闻稿
2015/07/17 职场文书
各类场合主持词开场白范文集锦
2019/08/16 职场文书
postgresql 删除重复数据案例详解
2021/08/02 PostgreSQL
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
2022/03/16 Redis