Вызов jQuery ajax () иногда приводит к ошибке со статусом ответа XmlHttpRequest 0

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


person matt b    schedule 06.11.2009    source источник


Ответы (2)


Я предполагаю, что это какая-то проблема, когда запрос никогда не попадает на сервер, поэтому нет заголовка ответа с кодом ошибки, но соединение закрывается должным образом, поэтому readystate получает значение 4, то есть проблема с брандмауэром или что-то в этом роде как это. Ознакомьтесь с этим сообщением, чтобы увидеть что я имею в виду.

person Ryan Lynch    schedule 06.11.2009

Мы обнаружили, что этот конкретный код состояния может быть вызван переходом пользователя со страницы (например, нажатием кнопки «Назад») до завершения вызова AJAX.

person Cory R. King    schedule 18.10.2010
comment
То же и для нас. Есть ли способ быть уверенным в том, что произошло (т.е. браузер прервал запрос ajax, потому что страница выгружается из-за навигации пользователя)? Проверка xhr.status == 0 кажется рискованной - person chadmyers; 08.02.2012