Одна из страниц нашего веб-приложения опрашивает сервер примерно каждые 10 секунд на предмет новых данных, используя метод jQuery ajax()
. Обычно у нас есть несколько сотен пользователей, просматривающих эту страницу одновременно, поэтому наш сервер получает несколько запросов в секунду. Нагрузка не проблема.
Для небольшого процента наших посетителей вызов jQuery ajax()
иногда вызывает событие ошибки. Большинство этих событий являются очевидными ошибками (например, тайм-аут, когда у посетителей возникают проблемы с сетью), но в небольшом подмножестве из них у меня возникают большие проблемы с поиском причины, и я немного озадачен.
Мы подключаем глобальный прослушиватель ошибок вот так
$.ajaxSetup({
timeout: oursettings.timeout,
error: function(xhr, status, e){
// error handling goes here
}
});
Для этого конкретного набора ошибок jQuery выдает нам status
из "error"
. Чтение через исходный код jQuery, (в частности, строка 3574) ошибка возникает только с этим значением, когда состояние готовности XmlHttpRequest имеет значение 4
(что означает, что это DONE
), а статус ответа HTTP находится за пределами значений успеха (< 200
или >= 300
).
Однако, когда мы исследуем сам объект XmlHttpRequest, мы обнаруживаем, что он имеет статус (HTTP-ответа) 0
. Согласно спецификации XHR, статус 0 должен быть установлен, когда установлен флаг ошибки верно ".
Здесь я действительно запутался, потому что единственная другая вещь, в спецификации XmlHttpRequest говорится о том, что "флаг ошибки"
С состоянием DONE связан флаг ошибки, который указывает на какой-либо тип сетевой ошибки или прерывания. Это может быть истина или ложь, а начальное значение - ложь.
В спецификации не указывается, какой атрибут или где хранится этот флаг ошибки (т.е. доступен ли он в xhr.error
?).
Итак, я предполагаю, что мой вопрос сводится к следующему: правильно ли для нашего кода обработки ошибок ajax предполагать, что любые события, которые попадают в наш обработчик ошибок со статусом jQuery "error"
и xhr.status
из 0
, вызываются только по "сетевой ошибке или прерыванию беременности"?
Есть ли какое-либо другое условие или что-то еще, что могло привести к тому, что состояние готовности XmlHttpRequest будет DONE (4)
со статусом HTTP-ответа 0? Я хотел бы иметь возможность исключить любую вероятность ошибок на стороне сервера (поскольку наши журналы на стороне сервера ничего не показывают) и изменить логику обработки ошибок, чтобы не рассматривать этот сценарий как фатальную ошибку (что приводит к пользователь видит кучу больших красных сообщений об ошибках типа предупреждений).