Начиная с 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, которая всегда возвращала данные, даже из кеша); так что я просто хочу убедиться, что я обращаюсь с этим правильно. (Не хочу дойти до конца, а потом понять, что я должен был сделать это по-другому).