2012-05-14 14 views
7

se passiamo true per cache in $.ajax() il jquery memorizza nella cache i dati caricati, voglio sapere c'è un modo per modificare il tempo di cache per $.ajax()? per esempio se ajax richiesto in 10 minuti il ​​jquery carica i dati precedenti ma se richiesto dopo 10 minuti carica i dati nuovi.Modifica del tempo di cache in jQuery

UPDATE:

Abbiamo bisogno di memorizzare nella cache i dati JSON, quindi dovrei usare Ajax in JSON tipo di dati

+1

Impostare le intestazioni della cache sul server per 10 minuti. – epascarello

+0

Sembra che ci siano alcune informazioni vitali mancanti a questa domanda leggendo la risposta di Vincent. Sembra che tu stia effettuando una chiamata AJAX su una risorsa HTML e ti aspetti il ​​risultato come JSON \ -: – hippietrail

risposta

4

jQuery in realtà non memorizza nella cache le richieste di voi - quando si imposta cache-false, semplicemente set alcune intestazioni e passa una variabile di stringa di query "cache buster" (ad esempio, ?_=487262189472) per impedire al browser o ai proxy di restituire una risposta memorizzata nella cache.

Se si desidera la memorizzazione nella cache di 10 minuti, è possibile implementare la propria abbastanza facilmente. Per esempio,

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

Poi basta aggiungere che in una variabile stringa di query per le vostre richieste (ad esempio, ?_noCache=<cacheBuster>).


Edit: per il gusto di fare questo una soluzione più completa, ecco un esempio di come è possibile utilizzare il cacheBuster su tutte le richieste di jQuery Ajax in modo trasparente alla chiamata effettiva Ajax:

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

Sei a conoscenza di casi in cui non funziona davvero e recupererai ancora una nuova richiesta al server? – vsync

2

Questo sembra un parco giochi ideale per sfruttare l'oggetto Deferred di jQuery.

C'è un grande articolo di Addy Osmani e Julian Aubourg su MSDN qui: http://msdn.microsoft.com/en-us/magazine/gg723713.aspx

insomma, hanno un esempio ci spiega che il modo in cui cache di richieste, questa richiesta, in particolare, verrà memorizzata nella cache per sempre.

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

e quindi risolvere il differita in quanto tale

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

quindi se si vuole determinati URL da memorizzare nella cache solo per un certo periodo di tempo siamo in grado di modificare il codice esistente e fare qualcosa sulla falsariga di (nota che questa è la parte superiore della mia testa)

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

e utilizzando un 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) 
}); 

dove callback restituirà i tradizionali jQuery Ajax argomenti successo/errore data, textStatus e jqXHR

se si vuole JSON utilizzare $.getJSON invece di $.get

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

nota che si potrebbe ancora usare appena $.ajax

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

Grazie, ma voglio ottenere i dati JSON, questa funzione non passa i dati JSON al mio callback – MajAfy

+0

Ho aggiornato la mia risposta con un ulteriore esempio che mostra come e cosa viene restituito. Ho corretto anche la sintassi, quindi copia nuovamente l'esempio. –

+0

grazie, gli argomenti in callback sono HTML, abbiamo bisogno di JSON, penso che dovremmo cambiare la funzione '$ .getCachedURL' – MajAfy

Problemi correlati