angularjs 缓存的使用详解


Posted in Javascript onMarch 19, 2018

一、什么是缓存

一个缓存就是一个组件,它可以透明地存储数据,以便未来可以更快地服务于请求。

缓存能够服务的请求越多,整体系统性能就提升得越多。

二、Angular 中的缓存

2.1 $cacheFactory 简介

$cacheFactory 是一个为所有Angular服务生成缓存对象的服务。在内部, $cacheFactory 会创建一个默认的缓存对象,即使我们并没有显示地创建。

要创建一个缓存对象,可以使用 $cacheFactory 通过一个ID创建一个缓存:

var cache = $cacheFactory('myCache');
这个 $cacheFactory 方法可以接受两个参数:

cacheId (字符串):这个 cacheId 就是创建缓存时的ID名称。可以通过 get() 方法使用缓存名称来引用它。

capacity :这个容量描述了在任何给定时间要使用缓存存储并保存的缓存键值对的最大数量。

2.2 缓存对象

缓存对象自身有下列这些方法可以用来与缓存交互。

info() : info() 方法返回缓存对象的ID、尺寸和选项。

put() : put() 方法允许我们把任意JavaScript对象值形式的键(字符串)放进缓存中。cache.put("hello","world");

put() 方法会返回我们放入缓存中的值。

get() : get() 方法让我们能够访问一个键对应的缓存值。如果找到了这个键,它会返回它的值;如果没有找到,它会返回 undefined 。cache.get("hello");

remove() : remove() 函数用于在找到一个键值对的情况下从缓存中移除它。如果没有找到,它就会返回 undefined 。cache.remove("hello");

removeAll() : removeAll() 函数用于重置缓存,同时移除所有已缓存的值。

destory() : destory() 方法用于从 $cacheFactory 缓存注册表中移除指定缓存的所有引用。

三、$http 中的缓存

Angular的 $http 服务创建了一个带有ID为 $http 的缓存。 要让 $http 请求使用默认的缓存 对象很简单: $http() 方法允许我们给它传递一个 cache 参数。

 3.1 默认的 $http 缓存

当数据不会经常改变时,默认的 $http 缓存就特别有用了。可以像这样设置它:

$http({
  method: 'GET',
  url: '/api/users.json',
  cache: true//设置为true只是用来使用$http默认的缓存机制
});

现在,通过 $http 到URL /api/user.json 的每个请求将会存储到默认的 $http 缓存中。 这个$http 缓存中的请求键就是完整的URL路径。

如果需要,也可以操作这个默认的 $http 缓存(比如,如果我们发起的另外一个没有缓存的请求提醒我们发生了增量变化,我们就可以在默认的 $http 请求中清除这个请求)。

为了引用 $http 的默认请求,只需通过 $cacheFactory() 使用ID来获取到该缓存:

var cache = $cacheFactory('$http');

对于所掌控的缓存,我们可以在需要时进行所有的正常操作,比如检索已缓存的响应,从缓存中清除条目,或者消除所有缓存的引用。

// 获取上一次请求的缓存
var usersCache = cache.get('http://example.com/api.users.json');
// 删除上一次请求的缓存入口
cache.remove('http://example.com/api.users.json');
// 重新开始并移除全部缓存
cache.removeAll();
var cache = $cacheFactory.get('$http');
    if(cache.get('cacheData')){
      console.log(cache.get('cacheData'));
    }else{
      helloService.play().then(
        function (data) {
          cache.put("cacheData", data);//往缓存中放入数据
          console.log(data);
        }
      );
    }

3.2 自定义缓存

有时候能够对缓存有更多的控制以及针对缓存的表现创建规则,这就需要创建一个新的缓存来使用 $http 请求。

通过自定义的缓存来让 $http 请求发起请求很简单。可以采用传递缓存实例的方式,而不必传递一个布尔参数 true 给请求。

var myCache = $cacheFactory('myCache');
$http({
method: 'GET',

utl: '/api/users.json',

cache: myCache
});

一个小demo:定义一个缓存服务,依赖注入到你要用的控制器中,直接使用

define([
  'angularModule'
],function(app){
  app.factory('myCache', ['$cacheFactory', function($cacheFactory){
    return $cacheFactory('myCache'); //自定义一个缓存服务
  }])
});
//自定义缓存,有缓存就从缓存里取,否则就发送请求
    if(myCache.get('cacheData')){
      console.log(myCache.get('cacheData'));
    }else{
      helloService.play(myCache).then(
        function (data) {
          myCache.put("cacheData", data);
          console.log(data);
        }
      );
    }
      cache:只是为了可以使用默认$http的缓存机制
      play : function (myCache) {
        return httpRequestService.request({
          method : 'get',
          url : 'http://localhost:8080/hello/play',
          cache : myCache
        })
      }

现在, $http 将会使用自定义的缓存而非默认缓存。

四、为 $http 设置默认缓存

每次我们想要发起一个 $http 请求时都要给它传递一个缓存实例并不方便,特别是对每个请求使用同一缓存的时候。

其实可以在模块的 .config() 方法中通过 $httpProvider 设置 $http 默认使用的缓存对象。

angular.module('myApp', []).config(function($httpProvider) {
$httpProvider.defaults.cache = $cacheFactory('myCache', {capacity: 20});
});

这个 $http 服务不再使用它为我们创建的默认缓存;它会使用我们自定义的缓存,实际上这就是一个近期缓存最久未使用算法① (Least Recently Used,LRU)。

LRU缓存根据缓存容量只保留最新的缓存数目。也就是说,我们的缓存容量为20,因此会缓存前20个请求,但是进入第21个请求时,最近最少使用的请求条目就会从缓存中被删除。这个缓存自身会负责具体哪些要维护,哪些要移除。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js的正则test,match,exec详细解析
Jan 29 Javascript
用原生js做个简单的滑动效果的回到顶部
Oct 15 Javascript
javascript实现简单的贪吃蛇游戏
Mar 31 Javascript
javascript中createElement的两种创建方式
May 14 Javascript
代码分析jQuery四种静态方法使用
Jul 23 Javascript
jQuery Easyui Datagrid实现单行的上移下移及保存移动的结果
Aug 15 Javascript
vue自定义指令实现v-tap插件
Nov 03 Javascript
JS回调函数基本定义与用法实例分析
May 24 Javascript
Vue2.0实现购物车功能
Jun 05 Javascript
详解vue-cli与webpack结合如何处理静态资源
Sep 19 Javascript
vue返回上一页面时回到原先滚动的位置的方法
Dec 20 Javascript
原生JS封装vue Tab切换效果
Apr 28 Vue.js
javascript原生封装一个淡入淡出效果的函数测试实例代码
Mar 19 #Javascript
react-native-video实现视频全屏播放的方法
Mar 19 #Javascript
vue实现树形菜单效果
Mar 19 #Javascript
VUE重点问题总结
Mar 19 #Javascript
p5.js入门教程之键盘交互
Mar 19 #Javascript
vue 实现的树形菜的实例代码
Mar 19 #Javascript
Servlet3.0与纯javascript通过Ajax交互的实例详解
Mar 18 #Javascript
You might like
改德生G88 - 加装等响度低音提升电路
2021/03/02 无线电
自动分页的不完整解决方案
2007/01/12 PHP
php数组函数序列之krsort()- 对数组的元素键名进行降序排序,保持索引关系
2011/11/02 PHP
php命令行用法入门实例教程
2014/10/27 PHP
php版微信小店调用api示例代码
2016/11/12 PHP
基于jquery的bankInput银行卡账号格式化
2012/08/22 Javascript
javascript上传图片前预览图片兼容大多数浏览器
2013/10/25 Javascript
js中跨域方法原理详解
2015/07/19 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
2015/08/27 Javascript
Javascript中获取浏览器类型和操作系统版本等客户端信息常用代码
2016/06/28 Javascript
vue.js中$watch的用法示例
2016/10/04 Javascript
轻松实现jquery选项卡切换效果
2016/10/10 Javascript
Javascript将字符串日期格式化为yyyy-mm-dd的方法
2016/10/27 Javascript
js模糊查询实例分享
2016/12/26 Javascript
一篇文章搞定JavaScript类型转换(面试常见)
2017/01/21 Javascript
VUE中使用Vue-resource完成交互
2017/07/21 Javascript
javascript 中事件冒泡和事件捕获机制的详解
2017/09/01 Javascript
vue+iview写个弹框的示例代码
2017/12/05 Javascript
jQuery操作cookie的示例代码
2019/06/05 jQuery
jquery实现简单每周轮换的日历
2020/09/10 jQuery
Python分治法定义与应用实例详解
2017/07/28 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
解读python logging模块的使用方法
2018/04/17 Python
python 实现GUI(图形用户界面)编程详解
2019/07/17 Python
python数据处理之如何选取csv文件中某几行的数据
2019/09/02 Python
python中树与树的表示知识点总结
2019/09/14 Python
Python 实现try重新执行
2019/12/21 Python
python opencv圆、椭圆与任意多边形的绘制实例详解
2020/02/06 Python
python名片管理系统开发
2020/06/18 Python
HTML5 Geolocation API的正确使用方法
2018/12/04 HTML / CSS
Zavvi美国:英国娱乐之家
2017/03/19 全球购物
美国唇部护理专家:Sara Happ
2019/06/19 全球购物
俄罗斯外国汽车和国产汽车配件网上商店:Движком
2020/04/19 全球购物
项目建议书模板
2014/05/12 职场文书
python实现批量移动文件
2021/04/05 Python
JavaScript获取URL参数的方法分享
2022/04/07 Javascript