angularjs - HTTP 请求的自定义缓存

标签 angularjs http caching

我想缓存响应[即已解析的 JSON 响应] 的 HTTP 请求,而不是响应本身。我的数据很大并且是 gzip 压缩的,所以解压缩它实际上对性能有一定的影响,所以我想自己存储原始数据。

目前我正在使用 HTTP 拦截器进行缓存和 TimeToLive 机制 described here与 AngularJS 内置的 $cacheFactory 一起。

那么我如何使用拦截器停止 HTTP 请求并返回我自己的响应。注意我仍然计划使用 $cacheFactory,我只是管理我自己的数据。

.factory('cacheInterceptor', ['$cacheFactory', function($cacheFactory) {
  return {
    request: function(config) {
      if (config.cache) {
        // if we have stored this request, return it, else let the request happen naturally and cache after

        // Things I don't know:
        // How to return existing cache data and prevent the reqeust from happening
        // Cache the data I get back from a HTTP request
      }

      return config;
    }
  };
}])

最佳答案

我更愿意将其注入(inject)到您的服务中,让您的工厂只处理接收/缓存的数据。这次我只为您创建了一个服务,它包含 HTTP/Cache 切换的逻辑。我认为您将能够创建一个工厂来自行处理您的数据/状态。

.service('getService', ['$cacheFactory', '$http', '$q', function($cacheFactory, $http, $q) {
    return {
        request: function() {
            function getData () {
                var deferred  = $q.defer();
                if (angular.isUndefined($cacheFactory.get('getServiceData'))) {
                    $http({
                        'method': 'GET',
                        'url': 'someUrl'
                    }).then(function (result) {
                        $cacheFactory.put('getServiceData', result.data);
                        deferred.resolve(result.data);
                    });
                } else {
                    deferred.resolve($cacheFactory.get('getServiceData'));
                }
            }

            return getData();
        },
        flush: function () {
            $cacheFactory.remove('getServiceData');
        },
        refresh: function () {
            this.flush();
            return this.refresh();
        }
    };
}]);

关于angularjs - HTTP 请求的自定义缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42829196/

相关文章:

angularjs - 在 Nginx 上部署 AngularJS 应用程序

javascript - Protractor 通过 ng-click 进行迭代

javascript - NodeJS : zlib. Gunzip( body ) 错误地返回 `undefined`

caching - 如何将数据添加到 service worker 中的 IndexedDb,这些数据作为来自 api 的 http 响应

html - 在 http header 响应或 html 元标记中设置缓存控制有什么区别?

php - 缓存查询困惑,laravel

angularjs - Prerender.io 不缓存我的页面

javascript - 使用 Object.create() 的 Angular 服务继承

rest - 从 Jenkins 在 JIRA 中创建请求

apache - 如何将页面重定向到 https 和站点的 'www' 版本