如何知道$http响应是从缓存获取的 - Angular

3

$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。

3个回答

1
我不确定信息是否被公开 - 文档提到即使资源被缓存,使用缓存的请求仍将是异步的,因此它看起来像任何其他请求。我能想到的唯一方法是滚动自己的缓存并使用它来知道何时发生了成功的查找。从文档中可以看到:
“您可以通过更新 $http.defaults.cache 属性将默认缓存更改为新对象(使用 $cacheFactory 构建)。现在,所有将其缓存属性设置为 true 的请求都将使用该缓存对象。”

2
我希望仍然有一些指示来表明数据是来自缓存还是其他地方。如果没有这样的指示,我认为这将是一个非常好的功能。 - vlio20

1
你可以通过查看Chrome开发者工具中的网络标签来确定调用是否被缓存。它会告诉你它是否已被缓存或已被调用。

2
我需要它以编程方式实现。 - vlio20

0

使用请求和响应处理程序很容易确定某些内容是否被缓存,但有一个注意事项。这仅适用于第一个请求在第二个请求之前完成的情况。如果在第一个请求返回之前发出了2个请求,Angular缓存将像魔术一样处理它们,并且只进行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;
        }
    };
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接