2012-05-14 10 views
7

jeśli mijamy true dla cache w $.ajax() jQuery będzie buforować załadowane dane, Chcę wiedzieć, czy jest jakiś sposób aby zmienić czas cache dla $.ajax()? na przykład, jeśli ajax zażądał w 10 minut jQuery wczytać poprzednie dane, ale jeśli zażądano po 10 minutach załadować nowe dane.Zmiana czasu cache w jquery

UPDATE:

Musimy buforować dane JSON, więc należy używać Ajax w JSON typ danych

+1

Ustaw nagłówki pamięci podręcznej na serwerze na 10 minut. – epascarello

+0

Wydaje się, że brakuje pewnych istotnych informacji na ten temat, czytając odpowiedź Vincenta. Wygląda na to, że wykonujesz wywołanie AJAX na zasobie HTML i spodziewasz się wyniku w postaci JSON \:: – hippietrail

Odpowiedz

4

jQuery właściwie nie buforują wnioski o ciebie - po ustawieniu cache do false, po prostu zestawy niektóre nagłówki i przekazuje zmienną łańcuchową zapytania "cache custer" (np. ?_=487262189472), aby uniemożliwić przeglądarce lub dowolnym proxy uzyskanie odpowiedzi z pamięci podręcznej.

Jeśli chcesz 10-minutowe buforowanie, możesz łatwo wdrożyć własne. Np

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

Następnie wystarczy dodać, że w zmiennej ciąg kwerendy na prośby (np ?_noCache=<cacheBuster>).


Edycja: przez wzgląd na przeprowadzenie tej bardziej kompletne rozwiązanie, oto przykład jak można użyć cacheBuster na wszystkich żądań jQuery Ajax transparentnie do rzeczywistej rozmowy Ajax:

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

Czy znasz przypadki, w których tak naprawdę nie zadziałają i nadal będą pobierać nowe żądania do serwera? – vsync

2

ten brzmi jak idealny plac zabaw do wykorzystania obiektu odroczonego jQuery.

Jest to świetny artykuł Addy Osmani i Juliana Aubourg na MSDN tutaj: http://msdn.microsoft.com/en-us/magazine/gg723713.aspx

w skrócie, mają one przykład tam, który wyjaśnia, w jaki sposób buforowania żądań, to żądanie w szczególności będą buforowane na zawsze.

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); 
}; 

a następnie rozwiązać odroczonego jako taki

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

więc jeśli chcesz niektóre adresy mają być buforowane tylko przez pewien czas możemy zmodyfikować istniejący kod i zrobić coś wzdłuż linii (uwaga że jest z góry na głowie)

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); 
}; 

i stosując 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) 
}); 

gdzie zwrotna powróci tradycyjne jQuery ajax argumenty sukces/błędach data, textStatus i jqXHR

jeśli chcesz JSON używać $.getJSON zamiast $.get

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

zauważyć, że można jeszcze po prostu użyć $.ajax

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

Dziękuję, ale chcę uzyskać dane JSON, ta funkcja nie przekazuje danych JSON do mojego wywołania zwrotnego – MajAfy

+0

Zaktualizowałem swoją odpowiedź dodatkowym przykładem, który pokazuje, jak i co zostaje przekazane. Poprawiłem również składnię, więc proszę ponownie skopiować przykład. –

+0

dziękuję, argumenty w wywołaniu zwrotnym to HTML, potrzebujemy JSON, myślę, że powinniśmy zmienić funkcję '$ .getCachedURL' – MajAfy