如果响应来自缓存,
$http
是否有任何指示?$http.get({url, cache: true).then(function(response, ..., moreData) { alert(moreData.fromCache) }) //alerts false
$http.get({url, cache: true).then(function(response, ..., moreData) { alert(moreData.fromCache) }) //alerts true
如您所见,第一个调用实际上是在执行 ajax 调用,因此它不是来自缓存,第二个调用从缓存中获取数据,因此它发出 true 警报
我不确定信息是否已公开 - 文档提到即使资源被缓存,请求(使用缓存)仍然是异步的,因此它看起来像任何其他请求。我唯一能想到的就是滚动你自己的缓存并使用它来知道何时发生成功的查找。来自文档:
您可以将默认缓存更改为新对象(使用 $cacheFactory)通过更新 $http.defaults.cache 属性。全部 将缓存属性设置为 true 的请求现在将使用此缓存 对象。
您可以通过 Chrome 开发者工具查看“网络”选项卡来查看调用是否已缓存。它会告诉您它是否被缓存或是否被调用。
很容易确定某些内容是否通过请求和响应处理程序进行了缓存,但需要注意。 此
ONLY
处理第一个请求完成 BEFORE
发出第二个请求的情况。 如果您在第一个返回之前进行 2 requests
,角度缓存将像魅力一样处理并且仅进行 1 次服务调用,两者都将显示为未缓存,这在技术上是正确的,因为它们都在等待第一个请求被缓存,但可能不是你想要的。
$httpProvider.interceptors.push(function() {
return {
'request': function requestInterceptor(config) {
if (config.cache) {
//Determine if a custom cache object is being used
var cache = angular.isObject(config.cache) ? config.cache : $http.defaults.cache;
config.wasCached = cache.get(config.url) ? true : false;
}
return config;
},
'response': function(response) {
if (response && response.config && response.config.wasCached) {
console.log('Was Cached!')
}
return response;
}
};
});