Je voudrais activer la mise en cache d'une réponse ajax dans javascript / navigateur.
À partir de la documentation jquery.ajax :
Par défaut, les demandes sont toujours émises, mais le navigateur peut diffuser des résultats hors de son cache. Pour interdire l'utilisation des résultats mis en cache, définissez le cache sur false. Pour que la demande signale un échec si l'actif n'a pas été modifié depuis la dernière demande, définissez ifModified sur true.
Cependant, aucune de ces adresses ne force la mise en cache.
Motivation:
Je souhaite mettre des $.ajax({...})
appels dans mes fonctions d'initialisation, dont certaines demandent la même url. Parfois, j'ai besoin d'appeler l'une de ces fonctions d'initialisation, parfois j'en appelle plusieurs.
Donc, je veux minimiser les demandes au serveur si cette URL particulière a déjà été chargée.
Je pourrais lancer ma propre solution (avec quelques difficultés!), Mais j'aimerais savoir s'il existe une manière standard de le faire.
Réponses:
cache:true
fonctionne uniquement avec les requêtes GET et HEAD.Vous pouvez lancer votre propre solution comme vous l'avez dit avec quelque chose du genre:
Travail du violon ici
EDIT: à mesure que cet article devient populaire, voici une réponse encore meilleure pour ceux qui veulent gérer le cache de timeout et vous n'avez pas non plus à vous soucier de tout le désordre dans $ .ajax () car j'utilise $ .ajaxPrefilter () . Maintenant, le réglage
{cache: true}
suffit pour gérer correctement le cache:Et le violon ici ATTENTION, ne fonctionne pas avec $ .Deferred
Voici une implémentation fonctionnelle mais imparfaite fonctionnant avec différé:
Fiddle ICI Quelques problèmes, notre identifiant de cache dépend de la représentation de l'objet JSON lib json2.
Utilisez la vue Console (F12) ou FireBug pour afficher certains journaux générés par le cache.
la source
localCache.set
fonction? Pourquoi pas simplementdoSomehing(jqXHR)
après avoir configuré le cache?doSomething(localCache.set(url,jqXHR));
mais c'est juste une préférence personnellelocalCache.data[url] = { _: new Date().getTime(), data: _.cloneDeep(cachedData, true) }; _.cloneDeep(localCache.data[url].data, true)
Je cherchais la mise en cache pour le stockage de mon application phonegap et j'ai trouvé la réponse de @TecHunter, ce qui est génial mais fini
localCache
.J'ai trouvé et j'ai appris que localStorage est une autre alternative pour mettre en cache les données renvoyées par un appel ajax. J'ai donc créé une démo en utilisant
localStorage
ce qui aidera les autres qui voudront peut-être utiliserlocalStorage
au lieu delocalCache
pour la mise en cache.Appel Ajax:
Pour stocker des données dans localStorage:
Si vous souhaitez supprimer localStorage, utilisez l'instruction suivante où vous le souhaitez:
J'espère que cela aide les autres!
la source
localStorage.removeItem("Info");
propos de"info"
l'URL?info
est l'objet pour stocker les données dans localStorage.responseJSON is not defined
. Aucun moyen de réparer cela? (mon type de données est html)Tous les navigateurs modernes vous fournissent des API de stockage. Vous pouvez les utiliser (localStorage ou sessionStorage) pour sauvegarder vos données.
Tout ce que vous avez à faire est, après avoir reçu la réponse, de la stocker dans le stockage du navigateur. Ensuite, la prochaine fois que vous trouverez le même appel, recherchez si la réponse est déjà enregistrée. Si oui, renvoyez la réponse à partir de là; sinon faire un nouvel appel.
Le plugin Smartjax fait également des choses similaires; mais comme votre exigence consiste simplement à enregistrer la réponse à l'appel, vous pouvez écrire votre code dans votre fonction jQuery ajax success pour enregistrer la réponse. Et avant de passer un appel, vérifiez simplement si la réponse est déjà enregistrée.
la source
Si j'ai bien compris votre question, voici la solution:
et pour des appels spécifiques
Si vous voulez l'opposé (cache pour des appels spécifiques), vous pouvez définir false au début et true pour des appels spécifiques.
la source
Ancienne question, mais ma solution est un peu différente.
J'écrivais une application Web d'une seule page qui faisait constamment des appels ajax déclenchés par l'utilisateur, et pour le rendre encore plus difficile, il fallait des bibliothèques utilisant des méthodes autres que jquery (comme dojo, xhr natif, etc.). J'ai écrit un plugin pour l'une de mes propres bibliothèques afin de mettre en cache les requêtes ajax aussi efficacement que possible d'une manière qui fonctionnerait dans tous les principaux navigateurs, quelles que soient les bibliothèques utilisées pour faire l'appel ajax.
La solution utilise jSQL (écrit par moi - une implémentation SQL persistante côté client écrite en javascript qui utilise indexeddb et d'autres méthodes de stockage dom), et est fournie avec une autre bibliothèque appelée XHRCreep (écrite par moi) qui est une réécriture complète de l'objet XHR natif.
Pour implémenter, tout ce que vous devez faire est d'inclure le plugin dans votre page, qui se trouve ici .
Il existe deux options:
Définissez l'âge maximum en minutes. toutes les réponses mises en cache plus anciennes que cela sont à nouveau demandées. La valeur par défaut est 1 heure.
Lorsqu'il est défini sur true, les faux appels XHR seront affichés dans la console pour le débogage.
Vous pouvez vider le cache sur une page donnée via
la source
entrez la description du lien ici
la source