Правильный способ обработки 304 не изменен в jQuery AJAX - PullRequest
18 голосов
/ 07 марта 2011

Начиная с jQuery 1.5, методы ajax теперь правильно обрабатывают 304 немодифицированных ответов, вызывая обработчик success (), в соответствии со спецификацией W3C для XMLHTTPRequest. Это позволяет вашему приложению обрабатывать запрос как успешный, даже если сервер фактически не возвращал никаких данных (потому что у вас уже есть последние данные в кеше).

Для обычного (не кэшированного) запроса GET обработчик успеха вызывается со следующими аргументами:

  • данные: {данные с сервера}
  • статус: ОК
  • jqXHR:
    • статус: 200
    • statusText: OK
    • responseText: {данные с сервера}

Для кэшированного GET-запроса обработчик успеха вызывается со следующими аргументами:

  • данные: не определено
  • статус: без изменений
  • jqXHR:
    • статус: 304
    • statusText: не изменено
    • responseText: {данные из кэша}

(по крайней мере, это то, как оно возвращается в IOS 4.2 для веб-приложения, которое использует кэш приложения через файл манифеста. Я предполагаю, что это согласуется с общим кэшированием браузера на большинстве платформ / браузеров).

Вы можете видеть, что аргумент "data" заполняется, только если запрос был 200 OK; где, поскольку jqXHR.responseText всегда заполняется данными, независимо от того, были ли эти данные получены с сервера (200 OK) или из кэша (304 Not Modified).

Учитывая, что в большинстве запросов GET ваш обработчик успеха захочет что-то делать с данными, которые вы получили, независимо от того, откуда они поступили, для вашего кода успеха было бы наиболее разумно всегда использовать jqXHR .responseText, а не делать что-то вроде этого:

if ("notmodified" === status) {
  // do something with jqXHR.responseText
} else {
  // do something with data
}

Или есть случай, когда jqXHR.responseText не будет заполнен в обработчике успеха, но данные arg будут ?

Мне нужно пройти через мою кодовую базу и изменить все обработчики успеха (ранее я работал на jQuery 1.4.2, которая всегда возвращала данные, даже из кеша); так что я просто хочу убедиться, что я обращаюсь с этим правильно. (Не хочу дойти до конца, а потом понять, что я должен был сделать это по-другому).

Ответы [ 2 ]

7 голосов
/ 07 марта 2011

Я только что заметил очевидный недостаток в своем вопросе .... Я предполагал, что данные всегда были текстовыми, поэтому использование jqXHR.responseText вместо аргумента data имело смысл.

Но вВ случае, когда dataType - это JSON, JSONP, скрипт и т. д. ... если данные, возвращенные в ответе 304 Not Modified, возвращаются как неопределенные, вам необходимо сначала преобразовать jqXHR.responseText из строки в нужный тип, например.

if (data === undefined) {
  data = $.parseJSON(jqXHR.responseText);
}

... и вы захотите делать это (потенциально дорогое) преобразование только тогда, когда вам действительно нужно..data всегда будет тем, что вернулось с сервера (который в некоторых случаях может , а не быть неопределенным для 304 ... например. сервер может вернуть некоторый дополнительный текст / html);что позволяет разработчику гибко выбирать, что он хочет делать в случае 304, например:

  • Отображение ответа от сервера (если есть)
  • Использование jqXHR.responseText
  • Сделайте что-нибудь еще полностью ...
5 голосов
/ 20 августа 2013

В зависимости от контекста, вы можете использовать параметр cache для запроса ajax:

$.ajax({
    url: ".....",
    dataType: "json",
    type: "GET",
        cache: false,
    contentType: "application/json",
        success: function (data, textStatus) {
            console.log("RECV: " + data);
        }
    });

Это работает для меня.

...