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ć.

Abhinav
źródło

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 :)

bonesnatch
źródło
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) {
        ...
    }
});
semente
źródło
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.

TriumphST
źródło
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