2012-05-14 36 views
7

緩存時間,如果我們在$.ajax()通過truecache jQuery的將緩存加載數據, 我想知道有沒有辦法改變的緩存時間$.ajax()? 例如,如果ajax在10分鐘內請求jquery加載以前的數據,但如果10分鐘後請求加載新鮮數據。更改jQuery中

UPDATE:

我們需要緩存JSON數據,所以我應該在JSON數據類型使用Ajax

+1

將服務器上的緩存標頭設置爲10分鐘。 – epascarello

+0

通過閱讀文森特的答案,似乎有一些重要的信息從這個問題中消失了。看起來你正在對HTML資源進行AJAX調用並期望得到的結果爲JSON \ - : – hippietrail

回答

4

jQuery的不實際緩存您的要求 - 當您設置cachefalse,它只是設置某些標題並傳遞「緩存攔截器」查詢字符串變量(例如,?_=487262189472)以防止瀏覽器或任何代理返回緩存的響應。

如果你想要10分鐘的緩存,你可以很容易地實現你自己的。例如,

var cacheBuster = new Date().getTime(); 
setInterval(function() { 
    cacheBuster = new Date().getTime(); 
}, 1000 * 60 * 10) 

然後,只需添加一個查詢字符串變量您的要求(例如,?_noCache=<cacheBuster>)。


編輯:爲使之成爲一個更完整的解決方案的緣故,這裏是你如何使用所有的jQuery Ajax請求透明的實際Ajax調用的cacheBuster一個例子:

$.ajaxPrefilter(function (options, originalOptions, jqXHR) { 
    var startChar = options.url.indexOf('?') === -1 ? '?' : '&'; 
    options.url += startChar + '_noCache=' + cacheBuster; 
}); 
+0

你是否知道哪些情況不會真正起作用,並且仍然會向服務器提取新請求? – vsync

2

這聽起來像利用jQuery的Deferred對象的理想場所。

有一個偉大的文章阿迪·奧斯馬尼和朱利安Aubourg MSDN上的位置:http://msdn.microsoft.com/en-us/magazine/gg723713.aspx

總之

,他們有一個例子那裏,解釋它們如何緩存請求,尤其在該請求將被永遠緩存。

var cachedPromises = {}; 

$.getCachedURL = function(url, callback) { 
    if (!cachedPromises[ url ]) { 
     cachedPromises[ url ] = $.Deferred(function(defer) { 
      $.get(url).then(defer.resolve, defer.reject); 
     }).promise(); 
    } 
    return cachedPromises[ url ].done(callback); 
}; 

,然後解決,所以如果你想某些URL被緩存在一段時間我們可以通過修改現有的代碼,做線沿線的東西遞延這樣

$.getCachedURL(url).then(successCallback, errorCallback); 

(注這是把我的頭頂部)

var cachedPromises = {}; 
var cachedTimeouts = {}; 

$.getCachedURL = function(url, callback, cacheTime) { 
    if (!cachedPromises[ url ]) { 
     cachedPromises[ url ] = $.Deferred(function(defer) { 
      $.get(url).then(defer.resolve, defer.reject); 
     }).promise(); 
     cachedTimeouts[ url ] = setTimeout(function() { 
      clearTimeout(cachedTimeouts[ url ]); 
      delete cachedPromises[ url ]; 
     }, cacheTime); 
    } 
    return cachedPromises[ url ].done(callback); 
}; 

,並使用一個回調:

var callback = function() { 
    console.log('callback', arguments) 
} 

var cacheTime = 3600; 

$.getCachedURL('/dynamic/config', callback, cacheTime).then(function() 
{ 
    console.log('success', arguments) 
}, function() 
{ 
    console.log('error', arguments) 
}); 

哪裏回調將返回傳統的jQuery AJAX更迭/錯誤論點datatextStatusjqXHR如果你想JSON

使用$.getJSON代替$.get

$.get(url).then(defer.resolve, defer.reject); 
$.getJSON(url).then(defer.resolve, defer.reject); 

請注意,您仍然可以只使用$.ajax

$.ajax({ 
    url: url, 
    dataType: 'json', 
}).then(defer.resolve, defer.reject); 
+0

謝謝,但我想獲取JSON數據,這個函數不會將JSON數據傳遞給我的回調。 – MajAfy

+0

我用一個額外的例子來更新我的答案,這個例子告訴你如何傳遞回來的東西。我修正了一些語法,所以請再次複製該示例。 –

+0

謝謝,回調中的參數是HTML,我們需要JSON,我認爲我們應該改變'$ .getCachedURL'函數 – MajAfy