在AngularJS中缓存HTTP"获取"服务响应?

Gav*_*guy 210 ajax caching http-get angularjs

我希望能够创建一个自定义AngularJS服务,该服务在其数据对象为空时发出HTTP"Get"请求,并在成功时填充数据对象.

下次调用此服务时,我想绕过再次发出HTTP请求的开销,而是返回缓存的数据对象.

这可能吗?

asg*_*oth 312

Angular的$ http 内置了一个缓存.根据文件:

cache - {boolean | Object} - 使用$ cacheFactory创建的布尔值或对象,用于启用或禁用HTTP响应的缓存.有关更多信息,请参阅 $ http Caching.

布尔值

所以你可以在其选项中设置cachetrue:

$http.get(url, { cache: true}).success(...);
Run Code Online (Sandbox Code Playgroud)

或者,如果您更喜欢配置类型的呼叫:

$http({ cache: true, url: url, method: 'GET'}).success(...);
Run Code Online (Sandbox Code Playgroud)

缓存对象

您还可以使用缓存工厂:

var cache = $cacheFactory('myCache');

$http.get(url, { cache: cache })
Run Code Online (Sandbox Code Playgroud)

你可以使用$ cacheFactory自己实现它(特别是在使用$ resource时):

var cache = $cacheFactory('myCache');

var data = cache.get(someKey);

if (!data) {
   $http.get(url).success(function(result) {
      data = result;
      cache.put(someKey, data);
   });
}
Run Code Online (Sandbox Code Playgroud)

  • 问题:将缓存数据保存到$ cacheFactory中有什么意义..为什么不将它保存到服务中的本地对象中?有什么好理由吗? (46认同)
  • @Spock,$ cacheFactory本身是一种可以跨多个控制器和角度组件使用的服务.它可以用作通用api服务,将所有$ http缓存到单个服务obj中,而不是为每个服务obj提供不同的服务对象. (11认同)
  • 看一下这个.它为您提供了大量的可定制性,包括localStorage支持,超时支持,各种好东西[http://jmdobry.github.io/angular-cache/](http://jmdobry.github.io/angular-cache/) (7认同)
  • 我对状态代码304特别好奇 - 浏览器缓存在没有启用缓存的情况下工作:是吗?如果没有,缓存:true是否有效?缓存是永久性的还是只在RAM中并在页面关闭时卸载? (3认同)
  • 有什么方法可以指定此缓存的时间限制而无需手动实现它? (2认同)
  • 使用`{cache:true}`时,有什么方法可以检查全新副本或缓存中的数据? (2认同)

gsp*_*tel 48

我认为现在有一个更简单的方法.这为所有$ http请求启用了基本缓存($ resource继承):

 var app = angular.module('myApp',[])
      .config(['$httpProvider', function ($httpProvider) {
            // enable http caching
           $httpProvider.defaults.cache = true;
      }])
Run Code Online (Sandbox Code Playgroud)

  • 您几乎不想缓存每个http请求.我不知道什么时候会发生这种情况? (45认同)
  • 如果要缓存大多数请求,则将默认值设置为true非常方便. (13认同)

Jam*_*emp 12

在当前稳定版本(1.0.6)中执行此操作的更简单方法需要更少的代码.

设置模块后添加工厂:

var app = angular.module('myApp', []);
// Configure routes and controllers and views associated with them.
app.config(function ($routeProvider) {
    // route setups
});
app.factory('MyCache', function ($cacheFactory) {
    return $cacheFactory('myCache');
});
Run Code Online (Sandbox Code Playgroud)

现在你可以将它传递给你的控制器:

app.controller('MyController', function ($scope, $http, MyCache) {
    $http.get('fileInThisCase.json', { cache: MyCache }).success(function (data) {
        // stuff with results
    });
});
Run Code Online (Sandbox Code Playgroud)

一个缺点是密钥名称也会自动设置,这可能会使清除它们变得棘手.希望他们能以某种方式添加关键名称.


XML*_*XML 7

如果您喜欢$ http的内置缓存但需要更多控制,请查看库angular-cache.您可以使用它来通过生存时间,定期清除以及将缓存持久保存到localStorage以便跨会话可用的选项无缝扩充$ http缓存.

FWIW,它还提供了工具和模式,使您的缓存成为一种更动态的数据存储,您可以将其作为POJO进行交互,而不仅仅是默认的JSON字符串.目前还无法评论该选项的效用.

(然后,最重要的是,相关的库角度数据是$ resource和/或Restangular的替代品,并且取决于角度缓存.)

  • 请注意,现在不推荐使用`angular-data`.最新的是`js-data-angular` http://www.js-data.io/v1.8.0/docs/js-data-angular (3认同)

Rim*_*ian 5

由于AngularJS工厂是单身,你可以简单地存储HTTP请求的结果,检索下一个你的服务被注入一些时间.

angular.module('myApp', ['ngResource']).factory('myService',
  function($resource) {
    var cache = false;
    return {
      query: function() {
        if(!cache) {
          cache = $resource('http://example.com/api').query();
        }
        return cache;
      }
    };
  }
);
Run Code Online (Sandbox Code Playgroud)