Jak ustawić cache false dla getJSON w jQuery?


80

Używam getJSONdo pobierania wyników po stronie serwera, ale napotykam problemy z pamięcią podręczną przeglądarki. Chcę, żeby pamięć podręczna była fałszywa. Próbowałem tego użyć tuż przed getJSONrozmową telefoniczną.

 $.ajaxSetup({
                cache: false
            })

Ale nie osiągam oczekiwanych rezultatów. Nadal pokazuje stare wyniki.

Zidentyfikowałem również inne rozwiązania, takie jak używanie, .ajaxale naprawdę nie chcę tego używać.


Odpowiedzi:


128

Twój kod potrzebuje tylko wyzwalacza, aby został włączony.

Umożliwi to wyłączenie pamięci podręcznej we wszystkich przyszłych AJAX

$(document).ready(function() {
  $.ajaxSetup({ cache: false });
});

Mam nadzieję, że to pomoże :)


7
To, że w skali globalnej zestawy, które jest zły i może wpływać na inne połączenia Ajax w programie, który dzieje potrzebę buforowanie
— vsync

@helloChris - oto dobre wyjaśnienie z jQuery "Nie można bezpiecznie manipulować stroną, dopóki dokument nie będzie" gotowy ". jQuery wykryje ten stan gotowości. Kod zawarty w $ (document) .ready () zostanie uruchomiony tylko raz strona Document Object Model (DOM) jest gotowa do wykonania kodu JavaScript. " CZYTAJ WIĘCEJ O API
— bonesnatch

7
@bonesnatch Większość kodu jQuery potrzebowałaby tego, prawda, ale to ustawienie nie ma nic wspólnego z DOM. Dokument może być w dowolnym stanie, kiedy wprowadzisz takie ustawienie, i o ile wiem, nie miałoby to znaczenia. Nie ma manipulacji stroną.
— chris

Dlaczego potrzebuje wyzwalacza? Proszę wyjaśnić, dlaczego nie działa tak, jak użył go oryginalny plakat?
— Rune Jeppesen

2
Bardziej estetyczny sposób użytkowania; $ .ajaxSettings.cache = false;
— Mustafa Çakıroğlu

83

Możesz użyć tego, co spowoduje globalne wyłączenie pamięci podręcznej:

$(document).ready(function() {
  $.ajaxSetup({ cache: false });
});

lub zamiast tego $.getJSON, aby wyłączyć pamięć podręczną tylko dla takiego żądania:

$.ajax({
    cache: false,
    url: "/path/to.json",
    dataType: "json",
    success: function(data) {
        ...
    }
});

50

odpowiedzi semente i bonesnatch są poprawne, ale jeśli chcesz użyć $ .getJSON i gdzie indziej, skorzystaj z jego buforowania (nie chcesz ustawiać pamięci podręcznej na fałsz dla wszystkich połączeń), ale chcesz zepsuć pamięć podręczną tylko dla pojedyncze wywołanie, możesz wstrzyknąć znacznik czasu do właściwości data $ .getJSON (). Dodając unikalną wartość do ciągu zapytania żądania, żądanie zawsze będzie unikalne i nie będzie przechowywane w pamięci podręcznej przez przeglądarkę - zawsze otrzymasz najnowsze dane.

Długa wersja:

var ts = new Date().getTime();
var data = {_: ts};
var url = '/some/path.json';

$.getJSON(url, data);

Wszystko w jednej wersji:

$.getJSON('/some/path', {_: new Date().getTime()});

Oba skutkują następującym żądaniem:

/some/path.json?_=1439315011130 

gdzie liczba na końcu jest sygnaturą czasową w momencie wywołania kodu i dlatego zawsze będzie unikalna.


2
Powiedziałbym zdecydowanie najlepsze rozwiązanie zadanego problemu. Nie musisz zmieniać swojego javascript, bez zmiany globalnej konfiguracji, tylko prosty dodatkowy parametr do przekazania do funkcji.
— Chris

Nie jest to rozwiązanie, jeśli używasz usługi Azure CDN.
— Platforma
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.