一种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中的onkeyup和onkeydown区别介绍
Apr 28 Javascript
使用GruntJS链接与压缩多个JavaScript文件过程详解
Aug 02 Javascript
js格式化金额可选是否带千分位以及保留精度
Jan 28 Javascript
利用Keydown事件阻止用户输入实现代码
Mar 11 Javascript
jQuery实现Tab选项卡切换效果简单演示
Nov 23 Javascript
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
Dec 15 Javascript
Vue.js实现表格动态增加删除的方法(附源码下载)
Jan 20 Javascript
MUI顶部选项卡的用法(tab-top-webview-main)详解
Oct 08 Javascript
微信小程序获取用户信息及手机号(后端TP5.0)
Sep 12 Javascript
TypeScript的安装、使用、自动编译的实现
Apr 10 Javascript
JavaScript实现手机号码 3-4-4格式并控制新增和删除时光标的位置
Jun 02 Javascript
JS实现百度搜索框
Feb 25 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 smarty的预保留变量总结
2008/12/04 PHP
php下将多个数组合并成一个数组的方法与实例代码
2011/02/03 PHP
php smarty 二级分类代码和模版循环例子
2011/06/01 PHP
codeigniter数据库操作函数汇总
2014/06/12 PHP
一个经典实用的PHP图像处理类分享
2014/11/18 PHP
PHP中命名空间的使用例子
2019/03/22 PHP
PHP Swoole异步MySQL客户端实现方法示例
2019/10/24 PHP
JavaScript设置FieldSet展开与收缩
2009/05/15 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
2015/08/17 Javascript
JavaScript字符串删除重复字符的方法
2015/12/25 Javascript
jquery调整表格行tr上下顺序实例讲解
2016/01/09 Javascript
jQueryUI中的datepicker使用方法详解
2016/05/25 Javascript
JQuery form表单提交前验证单选框是否选中、删除记录时验证经验总结(整理)
2017/06/09 jQuery
Vue网页html转换PDF(最低兼容ie10)的思路详解
2017/08/24 Javascript
JS闭包的几种常见形式实例详解
2017/09/16 Javascript
微信小程序实现点击按钮修改字体颜色功能【附demo源码下载】
2017/12/05 Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
2020/04/22 Javascript
JavaScript中条件语句的优化技巧总结
2020/12/04 Javascript
jquery实现穿梭框功能
2021/01/19 jQuery
python装饰器初探(推荐)
2016/07/21 Python
解决Django数据库makemigrations有变化但是migrate时未变动问题
2018/05/30 Python
python面向对象多线程爬虫爬取搜狐页面的实例代码
2018/05/31 Python
如何基于windows实现python定时爬虫
2020/05/01 Python
Python+PyQt5实现灭霸响指功能
2020/05/25 Python
Python 程序员必须掌握的日志记录
2020/08/17 Python
CSS Grid布局教程之什么是网格布局
2014/12/30 HTML / CSS
AT&T Wireless:手机、无限数据计划和配件
2018/06/03 全球购物
专科应届生求职信
2013/11/24 职场文书
转党组织关系介绍信
2014/01/08 职场文书
社区交通安全实施方案
2014/03/22 职场文书
校园安全广播稿范文
2014/09/25 职场文书
一年级数学下册复习计划
2015/01/17 职场文书
2015关于重阳节的演讲稿
2015/03/20 职场文书
关于vue中如何监听数组变化
2021/04/28 Vue.js
Python Parser的用法
2021/05/12 Python
日本十大血腥动漫,那些被禁播的动漫盘点
2022/03/21 日漫