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 相关文章推荐
javascript控制frame,iframe的src属性代码
Dec 31 Javascript
jQuery帮助之筛选查找 children([expr])
Jan 31 Javascript
给ListBox添加双击事件示例代码
Dec 02 Javascript
用JS在浏览器中创建下载文件
Mar 05 Javascript
node.js中的url.format方法使用说明
Dec 10 Javascript
JavaScript实现多个重叠层点击切换效果的方法
Apr 24 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
Sep 26 Javascript
全面了解javascript三元运算符
Jun 27 Javascript
基于jQuery的select下拉框选择触发事件实例分析
Nov 18 Javascript
JS中的回调函数实例浅析
Mar 21 Javascript
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
Sep 04 Javascript
JavaScript实现点击切换验证码及校验
Jan 10 Javascript
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
PHP中一个控制字符串输出的函数
2006/10/09 PHP
PHP获取ip对应地区和使用网络类型的方法
2015/03/11 PHP
PHP xpath()函数讲解
2019/02/11 PHP
PHP实时统计中文字数和区别
2019/02/28 PHP
基于JavaScript 下namespace 功能的简单分析
2013/07/05 Javascript
jQuery仿天猫实现超炫的加入购物车
2015/05/04 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
2015/09/08 Javascript
jQuery使用经验小技巧(推荐)
2016/05/31 Javascript
RequireJS简易绘图程序开发
2016/10/28 Javascript
SelecT下拉框选中和取值的解决方法
2016/11/22 Javascript
详解基于Bootstrap+angular的一个豆瓣电影app
2017/06/26 Javascript
利用ES6实现单例模式及其应用详解
2017/12/09 Javascript
利用JavaScript的Map提升性能的方法详解
2019/08/14 Javascript
Vue 实现点击空白处隐藏某节点的三种方式(指令、普通、遮罩)
2019/10/23 Javascript
node实现mock-plugin中间件的方法
2019/12/25 Javascript
解决三元运算符 报错“SyntaxError: can''t assign to conditional expression”
2020/02/12 Javascript
使用React-Router实现前端路由鉴权的示例代码
2020/07/26 Javascript
vue+node 实现视频在线播放的实例代码
2020/10/19 Javascript
vue实现前端列表多条件筛选
2020/10/26 Javascript
Javascript新手入门之字符串拼接与变量的应用
2020/12/03 Javascript
[48:27]EG vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
[38:27]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第二场 11.26
2020/11/30 DOTA
Python fileinput模块使用介绍
2014/11/30 Python
python跳出双层for循环的解决方法
2019/06/24 Python
python利用tkinter实现屏保
2019/07/30 Python
Python openpyxl读取单元格字体颜色过程解析
2019/09/03 Python
django框架ModelForm组件用法详解
2019/12/11 Python
TensorFlow tf.nn.conv2d实现卷积的方式
2020/01/03 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
2020/02/29 Python
python 如何使用find和find_all爬虫、找文本的实现
2020/10/16 Python
西班牙拥有最佳品牌的动物商店:Animalear.com
2018/01/05 全球购物
新加坡网上花店:FlowerAdvisor新加坡
2018/10/05 全球购物
应届大学生的推荐信
2013/11/20 职场文书
2014最新预备党员思想汇报范文:中国梦,我的梦
2014/10/25 职场文书
幸福终点站观后感
2015/06/04 职场文书
会议开幕致辞怎么写
2016/03/03 职场文书