2015-05-22 101 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 
    } 

}