一种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 相关文章推荐
JS 数字转换研究总结
Dec 26 Javascript
JavaScript中判断整数的多种方法总结
Nov 08 Javascript
JS实现鼠标滑过折叠与展开菜单效果代码
Sep 06 Javascript
json格式数据的添加,删除及排序方法
Jan 21 Javascript
深入浅析JavaScript面向对象和原型函数
Feb 06 Javascript
Javascript实现图片加载从模糊到清晰显示的方法
Jun 21 Javascript
实例解析angularjs的filter过滤器
Dec 14 Javascript
vue组件间通信子与父详解(二)
Nov 07 Javascript
angular json对象push到数组中的方法
Feb 27 Javascript
微信小程序实现商城倒计时
Nov 01 Javascript
vue 解决computed修改data数据的问题
Nov 06 Javascript
js实现表单项的全选、反选及删除操作示例
Jun 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开发的一些注意点总结
2010/10/12 PHP
ThinkPHP CURD方法之limit方法详解
2014/06/18 PHP
PHP的switch判断语句的“高级”用法详解
2014/10/01 PHP
PHP读取汉字的点阵数据
2015/06/22 PHP
PHP实现简易blog的制作
2016/10/24 PHP
js设置组合快捷键/tabindex功能的方法
2013/11/21 Javascript
js中浮点型运算BUG的解决方法说明
2014/01/06 Javascript
js时间比较示例分享(日期比较)
2014/03/05 Javascript
Angularjs全局变量被作用域监听的正确姿势
2016/02/06 Javascript
require.js+vue开发微信上传图片组件
2016/10/27 Javascript
JS闭包与延迟求值用法示例
2016/12/22 Javascript
JS中showModalDialog关闭子窗口刷新主窗口用法详解
2017/03/25 Javascript
vue系列之动态路由详解【原创】
2017/09/10 Javascript
vue和webpack项目构建过程常用的npm命令详解
2018/06/15 Javascript
JS实现在线ps功能详解
2019/07/31 Javascript
超简单的微信小程序轮播图
2019/11/22 Javascript
JS实现小星星特效
2019/12/24 Javascript
JS实现字体背景跑马灯
2020/01/06 Javascript
使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解
2020/06/10 Javascript
利用JS判断元素是否为数组的方法示例
2021/01/08 Javascript
[01:03:38]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS CIS
2014/05/22 DOTA
[40:05]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第一局
2016/02/25 DOTA
[01:10:58]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
[02:07]TI9显影之尘系列 - Vici Gaming
2019/08/20 DOTA
Python利用带权重随机数解决抽奖和游戏爆装备问题
2016/06/16 Python
用十张图详解TensorFlow数据读取机制(附代码)
2018/02/06 Python
如何安装并使用conda指令管理python环境
2019/07/10 Python
Python Socketserver实现FTP文件上传下载代码实例
2020/03/27 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
2020/05/26 Python
使用Python实现微信拍一拍功能的思路代码
2020/07/09 Python
详解python算法常用技巧与内置库
2020/10/17 Python
会计实习期自我鉴定
2013/10/06 职场文书
遗嘱继承公证书
2014/04/09 职场文书
夫妻分居协议书范文
2014/11/26 职场文书
婚庆司仪开场白
2015/05/29 职场文书
Django中celery的使用项目实例
2022/07/07 Python