一种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 相关文章推荐
Firefox下提示illegal character并出现乱码的原因
Mar 25 Javascript
js 分页全选或反选标识实现代码
Aug 09 Javascript
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
Oct 11 Javascript
jQuery创建DOM元素实例解析
Jan 19 Javascript
jQuery插件Timelinr 实现时间轴特效
Oct 04 Javascript
详解Vue-cli 创建的项目如何跨域请求
May 18 Javascript
javascript中mouseenter与mouseover的异同
Jun 06 Javascript
Vue的移动端多图上传插件vue-easy-uploader的示例代码
Nov 27 Javascript
jQuery.validate.js表单验证插件的使用代码详解
Oct 22 jQuery
Vue.js组件高级特性实例详解
Dec 24 Javascript
layui默认选中table的CheckBox复选框方法
Sep 19 Javascript
javscript 数组扁平化的实现
Feb 03 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
在Zeus Web Server中安装PHP语言支持
2006/10/09 PHP
简单的php写入数据库类代码分享
2011/07/26 PHP
PHP得到mssql的存储过程的输出参数功能实现
2012/11/23 PHP
Zend Framework教程之Zend_Db_Table_Row用法实例分析
2016/03/21 PHP
php微信公众平台开发之微信群发信息
2016/09/13 PHP
javascript parseInt 大改造
2009/09/27 Javascript
javascript 动态生成私有变量访问器
2009/12/06 Javascript
使用JS进行目录上传(相当于批量上传)
2010/12/05 Javascript
基于jquery的关于动态创建DOM元素的问题
2010/12/24 Javascript
DOM 事件流详解
2015/01/20 Javascript
Jquery常用的方法汇总
2015/09/01 Javascript
微信小程序开发之IOS和Android兼容的问题
2017/09/26 Javascript
vuejs使用axios异步访问时用get和post的实例讲解
2018/08/09 Javascript
记React connect的几种写法(小结)
2018/09/18 Javascript
一个因@click.stop引发的bug的解决
2019/01/08 Javascript
使用JavaScript实现贪吃蛇游戏
2020/09/29 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
Python实现的HTTP并发测试完整示例
2020/04/23 Python
Python下载指定页面上图片的方法
2016/05/12 Python
python创造虚拟环境方法总结
2019/03/04 Python
pandas按行按列遍历Dataframe的几种方式
2019/10/23 Python
HTML5中canvas中的beginPath()和closePath()的重要性
2018/08/24 HTML / CSS
纽约著名的服装辅料来源:M&J Trimming
2017/07/26 全球购物
Booking.com亚太地区:Booking.com APAC
2020/02/07 全球购物
电信专业应届生自荐信
2013/09/28 职场文书
教师读书活动总结
2014/05/07 职场文书
学习经验演讲稿
2014/05/10 职场文书
元旦晚会活动总结
2014/07/09 职场文书
办公室主任四风问题对照检查材料思想汇报
2014/09/28 职场文书
初婚初育证明范本
2014/11/24 职场文书
如何写观后感
2015/06/19 职场文书
运动会200米广播稿
2015/08/19 职场文书
中国古代史学名著《战国策》概述
2019/08/09 职场文书
golang http使用踩过的坑与填坑指南
2021/04/27 Golang
深入讲解Vue中父子组件通信与事件触发
2022/03/22 Vue.js
【TED出品】天梯非主流开心游1700 划水骑士
2022/03/31 魔兽争霸