2015-05-22 100 views
1

我在一个Ionic应用中使用Angular $http.get()来调用外部服务的API调用,并实现了CacheFactory插件以使缓存更加可配置的。

一切工作正常,如果我向相同的端点重复API请求,CacheFactory返回缓存的响应,并且在浏览器控制台中看不到实际的HTTP请求,直到缓存过期时间过去。

但我想能够确定我正在使用的数据是来自缓存还是来自新的HTTP请求。我怎样才能做到这一点?

有控制台登录的$http.get()输出我看不出任何有用的东西,其实响应对象无论从高速缓存或HTTP调用是相同的。

任何想法感激地收到。

+0

只是一个想法,因为我没有时间玩这个想法,但 - 可以一个HTTP拦截器帮助?我想知道当缓存处理请求时它们是否会被忽略(这可以帮助您推断缓存是否最近用于特定请求);或者,如果您可以使用一个将时间戳附加到标题属性或可能存在于缓存中的某个东西,并且您可以检查以查看请求是否“新鲜”... – JcT

+0

否则,我注意到http:/ /jmdobry.github.io/angular-cache/(是'角cache'的'CacheFactory'插件,您是指什么?)有一个'onExpire'回调我认为可能是一些使用的... – JcT

+0

我想检查如果$ http cache已经有一个与请求相关的密钥可能会有所帮助。 – n1313

回答

0

您可以使用记忆请求的输入,所以当您调用get方法时,如果存储器对象包含的键等于请求参数的哈希形式,那么您知道这个请求将被缓存,只要它包含与之前其他请求相同的参数。在每个密钥下,您可以保存一个时间戳以计算自第一次完成此请求以来的毫秒数与现在的毫秒数之差。

// some where on your code 

app.factory('MyMemorizer', ['EXPIRATION_CACHE_TIME', function 

(EXPIRATION_CACHE_TIME) { 
// EXPIRATION_CACHE_TIME constant with the milliseconds of the expiration cached 
var memo = {}; 
    return { 
    entryExist: function (obj) { 
     var timestamp = getEntry(inputs), 
     timeDelta = Date.now() - timestamp; 
     return timeDelta > EXPIRATION_CACHE_TIME); 
    } 

    }; 

    function getEntry(obj) { 
     var hash = createHash(obj); 
     if (memo.hasOwnProperty) { 
     return memo[hash]; 
     } 

     memo[hash] = Date.now(); 
     return memo[hash]; 
    } 


    function createHash(obj) { 
    var arr = []; 
    for (prop in obj) { 
    if (obj.hasOwnProperty(prop)) { 
     arr.push(encodeURIComponent(prop) + '=' + encodeURIComponent(obj[prop])); 
    } 
    } 

    return arr.join('&'); 
    } 

}); 

然后将其注入控制器或服务或您需要它的地方。

function invokeGetRequest (inputs) { 

    // ... do your request 

    if (MyMemorizer.entryExist(inputs)) { 
    // request is cached 
    } 

}