Me gustaría habilitar el almacenamiento en caché de una respuesta ajax en javascript / browser.
De los documentos de jquery.ajax :
De forma predeterminada, las solicitudes siempre se emiten, pero el navegador puede ofrecer resultados desde su caché. Para no permitir el uso de los resultados almacenados en caché, establezca la caché en falso. Para hacer que la solicitud informe un error si el activo no se ha modificado desde la última solicitud, establezca ifModified en verdadero.
Sin embargo, ninguno de estos aborda el almacenamiento en caché forzado.
Motivación:
quiero poner $.ajax({...})
llamadas en mis funciones de inicialización, algunas de las cuales solicitan la misma URL. A veces necesito llamar a una de estas funciones de inicialización, a veces llamo a varias.
Entonces, quiero minimizar las solicitudes al servidor si esa URL en particular ya se ha cargado.
Podría lanzar mi propia solución (¡con cierta dificultad!), Pero me gustaría saber si hay una forma estándar de hacerlo.
Respuestas:
cache:true
solo funciona con solicitudes GET y HEAD.Podría desarrollar su propia solución como dijo con algo como esto:
Trabajando el violín aquí
EDITAR: a medida que esta publicación se vuelve popular, aquí hay una respuesta aún mejor para aquellos que desean administrar el caché de tiempo de espera y tampoco tienen que preocuparse por todo el desorden en $ .ajax () ya que yo uso $ .ajaxPrefilter () . Ahora solo la configuración
{cache: true}
es suficiente para manejar el caché correctamente:Y el violín aquí CUIDADOSO, no funciona con $ .Deferred
Aquí hay una implementación funcional pero defectuosa que funciona con diferido:
Violín AQUÍ Algunos problemas, nuestro ID de caché depende de la representación del objeto JSON lib json2.
Use la vista Consola (F12) o FireBug para ver algunos registros generados por la caché.
fuente
localCache.set
función? ¿Por qué no simplementedoSomehing(jqXHR)
después de configurar el caché?doSomething(localCache.set(url,jqXHR));
pero es solo una preferencia personallocalCache.data[url] = { _: new Date().getTime(), data: _.cloneDeep(cachedData, true) }; _.cloneDeep(localCache.data[url].data, true)
Estaba buscando almacenamiento en caché para el almacenamiento de mi aplicación phonegap y encontré la respuesta de @TecHunter, que es genial, pero ya he terminado de usar
localCache
.Encontré y llegué a saber que localStorage es otra alternativa para almacenar en caché los datos devueltos por la llamada ajax. Entonces, creé una demostración usando
localStorage
que ayudará a otros que quieran usar enlocalStorage
lugar delocalCache
almacenar en caché.Llamada Ajax:
Para almacenar datos en localStorage:
Si desea eliminar localStorage, use la siguiente declaración donde quiera:
¡Espero que ayude a otros!
fuente
localStorage.removeItem("Info");
, ¿"info"
es la URL?info
es el objeto para almacenar los datos en localStorage.responseJSON is not defined
. Cualquier forma de arreglar esto? (mi tipo de datos es html)Todos los navegadores modernos le proporcionan apis de almacenamiento. Puede usarlos (localStorage o sessionStorage) para guardar sus datos.
Todo lo que tiene que hacer es después de recibir la respuesta, almacenarla en el almacenamiento del navegador. Luego, la próxima vez que encuentre la misma llamada, busque si la respuesta ya está guardada. Si es así, devuelva la respuesta desde allí; si no, haga una nueva llamada.
El complemento Smartjax también hace cosas similares; pero como su requisito es simplemente guardar la respuesta a la llamada, puede escribir su código dentro de su función de éxito jQuery ajax para guardar la respuesta. Y antes de realizar la llamada, compruebe si la respuesta ya está guardada.
fuente
Si entendí tu pregunta, aquí está la solución:
y para llamadas puntuales
Si desea lo contrario (caché para llamadas específicas), puede establecer falso al principio y verdadero para llamadas específicas.
fuente
Antigua pregunta, pero mi solución es un poco diferente.
Estaba escribiendo una aplicación web de una sola página que constantemente hacía llamadas ajax activadas por el usuario, y para hacerlo aún más difícil, requería bibliotecas que usaran métodos distintos de jquery (como dojo, xhr nativo, etc.). Escribí un complemento para una de mis propias bibliotecas para almacenar en caché las solicitudes ajax de la manera más eficiente posible de una manera que funcionaría en todos los navegadores principales, independientemente de las bibliotecas que se estuvieran utilizando para realizar la llamada ajax.
La solución usa jSQL (escrito por mí, una implementación de SQL persistente del lado del cliente escrita en javascript que usa indexeddb y otros métodos de almacenamiento dom), y está incluida con otra biblioteca llamada XHRCreep (escrita por mí) que es una reescritura completa de el objeto XHR nativo.
Para implementar todo lo que necesita hacer es incluir el complemento en su página, que está aquí .
Hay dos opciones:
Establezca la edad máxima en minutos. Se vuelven a solicitar las respuestas almacenadas en caché que sean más antiguas. El valor predeterminado es 1 hora.
Cuando se establece en verdadero, las llamadas XHR simuladas se mostrarán en la consola para su depuración.
Puede borrar el caché en cualquier página a través de
fuente
ingrese la descripción del enlace aquí
fuente