如何在AngularJS中检查URL是否已使用$ http.get()缓存?

时间:2015-04-08 05:18:50

标签: angularjs caching

根据这个问题,我只需要在{cache: true}中设置$http.get()。我的问题是,当我执行$http.get()时,如何检查URL是否已经缓存?

1 个答案:

答案 0 :(得分:1)

当使用带有{cache:true}选项的$ http.get()时,它将使用内置于$ cacheFactory中的angular来自动缓存http GET请求。

假设您使用默认配置进行缓存,那些缓存在名为“$ http”的缓存对象中。 要访问控制器中的缓存对象,您需要注入$ cacheFactory服务并按如下方式访问它:

angular.module('cacheExampleApp', []).
    controller('CacheController', ['$scope', '$cacheFactory', '$log', function($scope, $cacheFactory, $log) {
        var url = 'http://jsonplaceholder.typicode.com/posts/1';
        var httpCacheObj = $cacheFactory.get('$http');
        var urlCache = httpCacheObj.get(url)
        if (urlCache && urlCache[1]) {
            $log.debug('request already cached.');
        } else {
            $log.debug('request is not cached.');
        }
        $http.get(url, {cache: true}).then(function(response){
            // do something with the response...
        });
    };
}]);

一些注意事项:

  • 如果请求已被缓存,Angular将不会发出http请求,但机制仍然相同(使用$ http.get()。then()来访问它)。
  • $ cacheFactory.get('$ http')是缓存的$ http.get()请求的默认缓存对象。
  • 每个请求的url是存储在缓存对象中的密钥。
  • 访问缓存对象中的密钥时,将返回一个Array。我没有找到它的文档,但似乎数组中的每个键可以包含4个值,如果已经缓存:
    • urlCache[0] - >响应代码(例如200)
    • urlCache[1] - >响应主体为字符串。如果响应采用json格式,则可以使用JSON.parse(urlCache[1]);
    • 将其转换回JSON对象
    • urlCache[2] - >包含标题及其值的键值列表的对象。
    • urlCache[3] - >表示响应代码含义的String(例如“OK”状态200)。

请参阅jsfiddle example