2017-03-16 126 views
1

我想緩存響應[即解析JSON響應]的HTTP請求,而不是響應本身。我的數據很大並且是gzip,所以實際上有一個公平的性能解壓縮,所以想存儲原始數據本身。HTTP請求的自定義緩存

目前我正在使用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; 
    } 
    }; 
}]) 
+0

有沒有反饋Chris? – lin

回答

1

我願意將此注入到您的服務中,並使您的工廠只處理recived/cached的數據。這次我只爲你創建了一個服務,它保存了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(); 
     } 
    }; 
}]);