2012-05-14 8 views
7

si pasamos true para cache en el $.ajax() jQuery en caché los datos cargados, Quiero saber ¿hay alguna manera de cambiar el tiempo de caché para $.ajax()? por ejemplo, si ajax solicitó en 10 minutos los datos anteriores de carga de jquery, pero si se solicitan después de 10 minutos, cargue datos nuevos.Cambiar el tiempo de caché en jQuery

ACTUALIZACIÓN:

Necesitamos almacenar en caché los datos JSON, así que debemos usar Ajax en JSON tipo de datos

+1

Establezca los encabezados de la memoria caché en el servidor durante 10 minutos. – epascarello

+0

Parece que falta información vital en esta pregunta al leer la respuesta de Vincent. Parece que estás haciendo una llamada AJAX a un recurso HTML y esperando el resultado como JSON \ -: – hippietrail

Respuesta

4

jQuery en realidad no almacenar en caché las solicitudes de que - cuando se establece cache-false, simplemente conjuntos algunos encabezados y pasa una variable de cadena de consulta "cache buster" (p. ej., ?_=487262189472) para evitar que el navegador o cualquier proxy envíe una respuesta en caché.

Si desea un almacenamiento en caché de 10 minutos, puede implementar el suyo con bastante facilidad. Por ejemplo,

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

Después, simplemente añadir que en una variable de cadena de consulta a sus peticiones (por ejemplo, ?_noCache=<cacheBuster>).


Editar: en aras de hacer de esta una solución más completa, aquí está un ejemplo de cómo se puede utilizar la cacheBuster sobre todas las peticiones jQuery Ajax de forma transparente a la llamada real Ajax:

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

¿Conoces casos en los que realmente no funcionaría y aún obtendrás una nueva solicitud en el servidor? – vsync

2

Este suena como un patio de recreo ideal para aprovechar el objeto diferido de jQuery.

Hay un gran artículo de Addy Osmani y Julian Aubourg en MSDN aquí: http://msdn.microsoft.com/en-us/magazine/gg723713.aspx

en pocas palabras, tienen un ejemplo que hay que explica cómo se almacenan en caché peticiones, esta solicitud en particular, se almacenan en caché para siempre.

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

y luego resolver el diferido como tal

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

así que si quieres ciertas direcciones URL que se almacenan en caché para sólo un determinado momento podremos modificar el código existente y hacer algo en la línea de (nota que esta es la parte superior de la cabeza)

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

y el uso de una devolución de llamada:

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

donde devolución de llamada devolverá los argumentos tradicionales de éxito/error jQuery ajax data, textStatus y jqXHR

si quieres JSON utiliza $.getJSON en lugar de $.get

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

nota que aún se podía utilizar sólo $.ajax

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

Gracias, pero quiero obtener datos JSON, esta función no pasa datos JSON a mi devolución de llamada – MajAfy

+0

Actualicé mi respuesta con un ejemplo adicional que le muestra cómo y qué se devuelve. También arreglé algunas sintaxis, así que copia el ejemplo otra vez. –

+0

gracias, los argumentos en la devolución de llamada es HTML, necesitamos JSON, creo que deberíamos cambiar la función '$ .getCachedURL' – MajAfy

Cuestiones relacionadas