你能为Angular的$ http默认缓存系统设置一个到期时间吗? 我希望URL保留在缓存中1分钟,以便1分钟后向它发出的任何请求都会从服务器获取新数据。
答案 0 :(得分:8)
无法设置到期时间。但你可以手动完成。您必须访问$ http缓存:
var cache = $cacheFactory.get('$http');
并删除缓存的网址:
cache.remove(theUrl);
有关详细信息,请参阅documentation。
答案 1 :(得分:3)
根据this site,这里是$cacheFactory
规范
答案 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 */