Ich möchte das Caching einer Ajax-Antwort in Javascript / Browser aktivieren.
Aus den Dokumenten von jquery.ajax :
Standardmäßig werden immer Anforderungen ausgegeben, aber der Browser kann Ergebnisse aus seinem Cache bereitstellen. Um die Verwendung der zwischengespeicherten Ergebnisse zu verbieten, setzen Sie den Cache auf false. Setzen Sie ifModified auf true, damit die Anforderung einen Fehler meldet, wenn das Asset seit der letzten Anforderung nicht geändert wurde.
Keine dieser Adressen erzwingt jedoch das Caching.
Motivation:
Ich möchte $.ajax({...})
Anrufe in meine Initialisierungsfunktionen einfügen, von denen einige dieselbe URL anfordern. Manchmal muss ich eine dieser Initialisierungsfunktionen aufrufen, manchmal rufe ich mehrere auf.
Daher möchte ich die Anforderungen an den Server minimieren, wenn diese bestimmte URL bereits geladen wurde.
Ich könnte meine eigene Lösung entwickeln (mit einigen Schwierigkeiten!), Aber ich würde gerne wissen, ob es eine Standardmethode dafür gibt.
Antworten:
cache:true
funktioniert nur mit GET- und HEAD-Anfrage.Sie könnten Ihre eigene Lösung, wie Sie sagten, mit etwas in diese Richtung rollen:
Hier Geige arbeiten
BEARBEITEN: Da dieser Beitrag immer beliebter wird, ist hier eine noch bessere Antwort für diejenigen, die den Timeout-Cache verwalten möchten, und Sie müssen sich auch nicht um das ganze Durcheinander in $ .ajax () kümmern, da ich $ .ajaxPrefilter () verwende. . Jetzt
{cache: true}
reicht es aus, nur den Cache richtig zu behandeln:Und die Geige hier SORGFÄLTIG, nicht mit $ .Deferred arbeiten
Hier ist eine funktionierende, aber fehlerhafte Implementierung, die mit verzögert arbeitet:
Geige HIER Bei einigen Problemen hängt unsere Cache-ID von der JSON-Objektdarstellung von json2 lib ab.
Verwenden Sie die Konsolenansicht (F12) oder FireBug, um einige vom Cache generierte Protokolle anzuzeigen.
quelle
localCache.set
Funktion zurückrufen ? Warum nicht einfachdoSomehing(jqXHR)
nach dem Einstellen des Caches?doSomething(localCache.set(url,jqXHR));
aber es ist nur einelocalCache.data[url] = { _: new Date().getTime(), data: _.cloneDeep(cachedData, true) }; _.cloneDeep(localCache.data[url].data, true)
Ich suchte nach Caching für meinen Phonegap-App-Speicher und fand die Antwort von @TecHunter, die großartig ist, aber fertig ist
localCache
.Ich habe festgestellt und erfahren, dass localStorage eine weitere Alternative zum Zwischenspeichern der vom Ajax-Aufruf zurückgegebenen Daten ist. Also habe ich eine Demo erstellt,
localStorage
die anderen hilft, die sie möglicherweiselocalStorage
anstelle deslocalCache
Cachings verwenden möchten .Ajax Call:
So speichern Sie Daten in localStorage:
Wenn Sie localStorage entfernen möchten, verwenden Sie die folgende Anweisung, wo immer Sie möchten:
Hoffe es hilft anderen!
quelle
localStorage.removeItem("Info");
, über das"info"
ist es die URL?info
ist das Objekt zum Speichern der Daten in localStorage.responseJSON is not defined
. Wie kann man das beheben? (Mein Datentyp ist HTML)Alle modernen Browser bieten Ihnen Speicher-APIs. Sie können sie (localStorage oder sessionStorage) verwenden, um Ihre Daten zu speichern.
Alles, was Sie tun müssen, ist, nach Erhalt der Antwort diese im Browser-Speicher zu speichern. Wenn Sie das nächste Mal denselben Anruf finden, suchen Sie, ob die Antwort bereits gespeichert ist. Wenn ja, geben Sie die Antwort von dort zurück. Wenn nicht, tätigen Sie einen neuen Anruf.
Das Smartjax- Plugin macht ähnliche Dinge; Da Sie jedoch nur die Anrufantwort speichern müssen, können Sie Ihren Code in Ihre jQuery Ajax-Erfolgsfunktion schreiben, um die Antwort zu speichern. Und bevor Sie einen Anruf tätigen, überprüfen Sie einfach, ob die Antwort bereits gespeichert ist.
quelle
Wenn ich Ihre Frage verstanden habe, ist hier die Lösung:
und für bestimmte Anrufe
Wenn Sie das Gegenteil wünschen (Cache für bestimmte Anrufe), können Sie am Anfang false und true für bestimmte Anrufe festlegen.
quelle
Alte Frage, aber meine Lösung ist etwas anders.
Ich habe eine einseitige Web-App geschrieben, die ständig vom Benutzer ausgelöste Ajax-Aufrufe ausführte. Um dies noch schwieriger zu machen, waren Bibliotheken erforderlich, die andere Methoden als jquery verwendeten (wie Dojo, native xhr usw.). Ich habe ein Plugin für eine meiner eigenen Bibliotheken geschrieben, um Ajax-Anforderungen so effizient wie möglich zwischenzuspeichern, so dass es in allen gängigen Browsern funktioniert, unabhängig davon, welche Bibliotheken für den Ajax-Aufruf verwendet wurden.
Die Lösung verwendet jSQL (von mir geschrieben - eine clientseitige persistente SQL-Implementierung in Javascript, die indexeddb und andere dom-Speichermethoden verwendet) und wird mit einer anderen Bibliothek namens XHRCreep (von mir geschrieben) gebündelt, die vollständig neu geschrieben wird das native XHR-Objekt.
Um alles zu implementieren, was Sie tun müssen, fügen Sie das Plugin in Ihre Seite ein, die sich hier befindet .
Es gibt zwei Möglichkeiten:
Stellen Sie das maximale Alter in Minuten ein. Alle zwischengespeicherten Antworten, die älter als diese sind, werden erneut angefordert. Standard ist 1 Stunde.
Wenn true festgelegt ist, werden in der Konsole nachgebildete XHR-Aufrufe zum Debuggen angezeigt.
Sie können den Cache auf jeder Seite über löschen
quelle
Geben Sie hier die Linkbeschreibung ein
quelle