AngularJS $ http缓存到期时间

时间:2014-01-16 15:00:48

标签: angularjs

你能为Angular的$ http默认缓存系统设置一个到期时间吗? 我希望URL保留在缓存中1分钟,以便1分钟后向它发出的任何请求都会从服务器获取新数据。

4 个答案:

答案 0 :(得分:8)

无法设置到期时间。但你可以手动完成。您必须访问$ http缓存:

var cache = $cacheFactory.get('$http');

并删除缓存的网址:

cache.remove(theUrl);

有关详细信息,请参阅documentation

答案 1 :(得分:3)

根据this site,这里是$cacheFactory规范

  • 存储 Javascript堆内存
  • 驱逐算法最近最少使用(LRU)
  • 生存时间直到页面刷新
  • 支持重新验证
  • 需要远程服务器的合作

答案 2 :(得分:3)

另一种解决方案:

使用$httpProvider挂钩请求。

http_ttl_cache = {}  # save the last cache time
MyApp.config ['$httpProvider', ($httpProvider) ->
    $httpProvider.interceptors.push ['$cacheFactory', ($cacheFactory) ->
        request: (config) ->
            if config.params and config.params.__cache__
                config.cache = true

                N = config.params.__cache__
                delete config.params.__cache__

                if moment() - (http_ttl_cache[config.url] or 0) > 1000 * N     
                    cache = $cacheFactory.get('$http')                            
                    cache.remove(config.url)                                      
                    http_ttl_cache[config.url] = moment()
            return config
    ]
]

在您的控制器中:

# 600 is 600 seconds
$http.get("/api/books?limit=100", 
          {
               params: {'__cache__': 600, 'foo': 'bar'}
          }
)

答案 3 :(得分:0)

AngularJS 的基于过期时间的缓存实现可能如下所示:

MyAngularApp.factory('cache', function($cacheFactory) {    
    const cache = $cacheFactory('expire-cache');

    function get(key, defaultValue = null, expire = null) {    
        let cached = cache.get(key);
        let expired = cached && cached.expire > 0 && cached.expire < performance.now() - cached.created;
       
        if (!cached || expired) {
            cached = {
                value: typeof (defaultValue) === 'function' ? defaultValue() : defaultValue,
                expire: expire,
                created: performance.now()
            }

            if (cache.value !== null && 
                cache.value !== undefined) {

                cache.put(key, cached);
            }
        }
        
        return cache.value;
    }

    return {
        get: get,
        remove: function remove(key) { cache.remove(key) },
        clear: function clear() { cache.removeAll() },
    };    
});

可能的方法调用如下:

read = cache.get('keyName1', 'my permanent value');
read = cache.get('keyName2', 'my static value for 5 secs', 5000);
read = cache.get('keyName3', () => 'my on time value for 5 secs', 5000);

cache.remove('keyName1'); /* Remove one */

cache.clear(); /* Remove all */