Короткий ответ
Это , а не код ответа HTTP, но - это , задокументированное W3 как допустимое значение для атрибута status
XMLHttpRequest
(и, следовательно, также объекта jqXHR
для пользователей jQuery).
Охватывает целый ряд возможных ситуаций, в которых нет реального HTTP-кода ответа, доступного для отчета, либо потому, что вы не отправилизапрос, вы явно прервали его, страница выгружается, или x произошел сбой для одного из многих возможных значений x .
Длинный ответ
Во-первых, повторить: 0 - это , а не код состояния HTTP.Полный список их приведен в RFC 7231, раздел 6.1 , который не содержит 0, и введение в раздел 6 четко гласит, что
Элемент кода состояния являетсятрехзначный целочисленный код
, который не равен 0.
Однако 0 в качестве значения атрибута status
объекта XMLHttpRequest
равен документированы.Из документации по http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute:
4.7.1 Атрибут состояния
Атрибут status
должен возвращать результат выполнения этих шагов:
Если состояние UNSENT или OPENED, вернуть 0.
Если установлен флаг ошибки, вернуть 0.
ВернутьКод состояния HTTP.
Мы можем углубиться в спецификацию и выяснить, что означают эти условия для возврата 0.С http://www.w3.org/TR/XMLHttpRequest/#states:
4.5 Состояния
...
UNSENT
(числовое значение 0)
Объект построен.
OPENED
(числовое значение 1)
Метод open()
был успешно запущен.Во время этого состояния заголовки запроса могут быть установлены с помощью setRequestHeader()
, а запрос может быть выполнен с использованием метода send()
.
...
Флаг ошибки указываеткакой-то тип ошибки сети или выборочное завершение.Первоначально он не установлен.
Также важно отметить, что следующее возможное состояние после UNSENT
и OPENED
равно HEADERS_RECEIVED
:
HEADERS_RECEIVED
(числовое значение 2)
Все перенаправления (если таковые имеются) были выполнены, и все заголовки HTTP окончательного ответа были получены.Несколько ответных членов объекта теперь доступны.
Собрав все это вместе, краткий ответ таков, что 0 - это просто то, что возвращается атрибутом status
объекта XMLHttpRequest
, когда естьреальный код состояния не возвращается, потому что либо:
- Запрос еще не отправлен, либо
- Запрос был отправлен, но заголовки ответа еще не былиполучено, или
- Произошло одно из многих возможных обстоятельств, перечисленных в документах , которые привели к установке "флага ошибки".
Хорошо, но какие ошибки могут привести к установке этого загадочного «флага ошибки»?Если вы нажмете CTRL-F на «флаг ошибки» в документации W3, вы обнаружите, что он получает unset при отправке запроса, и он только когда-либо получает set как часть алгоритма«прекратить запрос».Просматривая все места , для которых вызывается алгоритм , вы обнаружите, что это происходит, когда:
Что касается XMLHttpRequest
, это все.
Помимо XMLHttpRequest
, я бы предположил, что библиотеки HTTP на языках вне JavaScript вполне могут использовать код состояния 0 аналогично, как значение по умолчанию, когда с сервера не был получен код состояния.