How to define expiration time on Cache in Angular $cacheFactory How to define expiration time on Cache in Angular $cacheFactory angularjs angularjs

How to define expiration time on Cache in Angular $cacheFactory


for TTL 1h, see below example

add factory:

.factory('cacheInterceptor', ['$cacheFactory', function($cacheFactory) {  var http_ttl_cache = {};  return {    request: function(config) {      var N;      if (config.timeToLive) {        config.cache = true;        N = config.timeToLive;        delete config.timeToLive;        if (new Date().getTime() - (http_ttl_cache[config.url] || 0) > N) {          $cacheFactory.get('$http').remove(config.url);          http_ttl_cache[config.url] = new Date().getTime();        }      }      return config;    }  };}])

then init in config push your interceptor.An interceptor is simply a regular service factory that is registered to that array.

.config(['$routeProvider', '$httpProvider', function($routeProvider, $httpProvider) {  $httpProvider.interceptors.push('cacheInterceptor');

example of request

$http.get('/permissions.json', {timeToLive: Constant.timeToLive}).then(function(result){

Constant is:

.constant('Constant', {  url: {    logout: '/auth/logout'  },  timeToLive: 60*60*1000})


I faced the problem too. The default $cacheFactory have no time to live (TTL).

You will need to implement this yourself. But before, you could give a look around, to see if someone already did it :

This one look pretty complete - http://jmdobry.github.io/angular-cache/

If you really want to implement your own solution (by implementing your own $cacheFactory) and need some help, feel free to ask.

Hope it gave you some clue.


I think @miukki answer's is great. Adding my modification to the request of @Vil

I modified the 'request' function of the 'cacheInterceptor' to use $timeout instead of relying on Date. It allows TTL to be more global for requests, So if one request sets a TTL and the 2nd doesn't but data is still in cached, it will still be used.

.factory('cacheInterceptor', ['$cacheFactory', '$timeout', function($cacheFactory, $timeout) {  var ttlMap = {};  return {    request: function(config) {      if (config.ttl) {        var ttl = config.ttl;        delete config.ttl;        config.cache = true;        // If not in ttlMap then we set up a timer to delete, otherwise there's already a timer.        if (!ttlMap[config.url]) {          ttlMap[config.url] = true;          $timeout(ttl)          .then(function() {            $cacheFactory.get('$http').remove(config.url);                      delete ttlMap[config.url];          });        }      }      return config;    }  };}])