一种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入门·动态的时钟,显示完整的一些方法,新年倒计时
Oct 01 Javascript
javascript prototype,executing,context,closure
Dec 24 Javascript
JavaScript constructor和instanceof,JSOO中的一对欢喜冤家
May 25 Javascript
IE6下通过a标签点击切换图片的问题
Nov 14 Javascript
jquery图片上下tab切换效果
Mar 18 Javascript
33个优秀的 jQuery 图片展示插件分享
Mar 14 Javascript
document.addEventListener使用介绍
Mar 07 Javascript
JS验证IP,子网掩码,网关和MAC的方法
Jul 02 Javascript
jQuery的bind()方法使用详解
Jul 15 Javascript
jQuery中的deferred使用方法
Mar 27 jQuery
vue实现下拉加载其实没那么复杂
Aug 13 Javascript
浅谈JS for循环中使用break和continue的区别
Jul 21 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
动漫女神老婆无限好,但日本女生可能就不是这么一回事了!
2020/03/04 日漫
为什么那些咖啡爱好者大多看不上连锁咖啡店?
2021/03/06 咖啡文化
php 页面执行时间计算代码
2008/12/04 PHP
PHP 批量删除 sql语句
2009/06/05 PHP
php图片加中文水印实现代码分享
2012/10/31 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
2013/06/23 PHP
php实现的漂亮分页方法
2014/04/17 PHP
PHP中file_get_contents高?用法实例
2014/09/24 PHP
使用PHPCMS搭建wap手机网站
2015/09/20 PHP
php静态成员方法和静态的成员属性的使用方法
2017/10/26 PHP
laravel config文件配置全局变量的例子
2019/10/13 PHP
PHP变量的作用范围实例讲解
2020/12/22 PHP
5个javascript的数字格式化函数分享
2011/12/07 Javascript
JavaScript实现点击按钮后变灰避免多次重复提交
2013/07/15 Javascript
JavaScript截取字符串的2个函数介绍
2014/08/27 Javascript
浏览器环境下JavaScript脚本加载与执行探析之defer与async特性
2016/01/14 Javascript
原生js实现查询天气小应用
2016/12/09 Javascript
JavaScript trim 实现去除字符串首尾指定字符的简单方法
2016/12/27 Javascript
AngularJS 使用ng-repeat报错 [ngRepeat:dupes]
2017/01/19 Javascript
label+input实现按钮开关切换效果的实例
2017/08/16 Javascript
vue proxyTable 接口跨域请求调试的示例
2017/09/12 Javascript
从源码看angular/material2 中 dialog模块的实现方法
2017/10/18 Javascript
给Python IDLE加上自动补全和历史功能
2014/11/30 Python
Django日志模块logging的配置详解
2017/02/14 Python
如何使用VSCode愉快的写Python于调试配置步骤
2018/04/06 Python
Python 单元测试(unittest)的使用小结
2018/11/14 Python
Python CSV文件模块的使用案例分析
2019/12/21 Python
Python中对象的比较操作==和is区别详析
2021/02/12 Python
CSS的pointer-events属性详细介绍(作用和注意事项)
2014/04/23 HTML / CSS
化学教师自荐信范文
2013/12/28 职场文书
高中生期末评语
2014/01/28 职场文书
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
学生抄袭作业的检讨书
2014/10/02 职场文书
夫妻婚内购房协议书
2014/10/05 职场文书
2015年禁毒宣传活动总结
2015/03/25 职场文书
Go遍历struct,map,slice的实现
2021/06/13 Golang