Что означают различные состояния готовности в XMLHttpRequest и как их использовать?

113

XMLHttpRequestимеет 5 readyStateс, и я использую только 1 из них (последний, 4).

Для чего нужны другие и в каких практических приложениях я могу их использовать?

Мариус
источник

Ответы:

172

Полный список readyStateзначений:

State  Description
0      The request is not initialized
1      The request has been set up
2      The request has been sent
3      The request is in process
4      The request is complete

https://www.w3schools.com/js/js_ajax_http_response.asp )

На практике вы почти никогда не используете ни один из них, кроме 4.

Некоторые XMLHttpRequest реализация может позволить вам увидеть частично полученные ответы в responseTextкогда readyState==3, но это не поддерживается всем и не следует полагаться.

Кирон
источник
5
Ошибки при передаче по-прежнему обновляют состояние readyState до 4. Однако полностью прерванная передача сбрасывает значение readyState до 0. Таким образом, ошибка передачи, которая является результатом перенаправления, на самом деле не является «ошибкой», и вы можете игнорировать ведение журнала / сообщение об ошибке, если состояние готовности xhr равно 0. Это немного хрупко, и ваш пробег может варьироваться в зависимости от того, является ли регистрация каждого события / ошибки «обязательным» или «желательным». Если это последнее, вы можете позволить себе потерять редкое событие, которое может быть ошибкой вместе с ReadyState, равным 0.
Грег Петтит
2
+1 к @MattBianco за совет. Я также хотел бы добавить, что Mozilla Developer Network MDN , возможно, является одним из самых популярных и заслуживающих доверия справочных сайтов для всех ваших потребностей в JavaScript / HTML / CSS. Выполняя поиск в Google, добавьте к запросу "mdn", и вы избавитесь от головной боли.
DondeEstaMiCulo
@GregPettit, можем ли мы использовать readystate 0 без подключения к Интернету, или существуют какие-либо причины, по которым «Запрос не инициализирован»
Вишал Шарма
4
Я не уверен, @vishalsharma - насколько я помню, состояние готовности равно 0, пока запрос не инициализирован. После этого любое другое «завершение» (успешное или ошибочное) обновит состояние готовности до 4. Таким образом, потеря интернета после начала передачи перевернет его на 4, а не обратно на 0. Если интернета никогда не было при передаче попытка, она все еще должна быть на 0; он переместится в 1 только после рукопожатия.
Грег Петтит
Объяснение readyState 2 неверно - или, по крайней мере, полностью вводит в заблуждение. Shure запрос был отправлен, но в этом состоянии фактически говорится, что все заголовки окончательного ответа были получены.
Инта
32

Кирон «s ответ содержит w3schools реф. на который никто не полагается, ответ bobince дает ссылку, которая фактически говорит о собственной реализации IE,

Итак, вот исходная документация, цитируемая, чтобы правильно понять, что представляет собой readystate:

Объект XMLHttpRequest может находиться в нескольких состояниях. Атрибут readyState должен возвращать текущее состояние, которое должно быть одним из следующих значений:

UNSENT (числовое значение 0)
Объект создан .

OPENED (числовое значение 1)
Метод open () был успешно вызван. Во время этого состояния заголовки запроса могут быть установлены с помощью setRequestHeader (), а запрос может быть выполнен с помощью метода send ().

HEADERS_RECEIVED (числовое значение 2)
Все перенаправления (если таковые имеются) были выполнены, и все HTTP-заголовки окончательного ответа были получены. Теперь доступны несколько ответных членов объекта.

ЗАГРУЗКА (числовое значение 3)
Получено тело объекта ответа.

DONE (числовое значение 4)
Передача данных завершена или что-то пошло не так во время передачи (например, бесконечные перенаправления).

Прочтите, пожалуйста, здесь: W3C Объяснение ReadyState

Вишал Шарма
источник
@CharlesWood, проблема для меня заключалась в том, что редактор разметки stackoverflow не принимает ссылку на w3c .. проверьте, поэтому я помещаю короткий URL-адрес из goo.gl .... я не понимаю, почему он не позволяет мне напрямую поставить w3c url ...
Вишал Шарма
Ха, я просто попробовал это в песочнице, и, похоже, это сработало.
Чарльз Вуд
22

Оригинальная полная документация

0, 1и 2только отслеживать, сколько из необходимых методов для выполнения запроса вы уже вызвали.

3сообщает вам, что начал поступать ответ сервера. Но когда вы используете XMLHttpRequestобъект с веб-страницы, вы почти ничего не можете (*) сделать с этой информацией, поскольку у вас нет доступа к расширенным свойствам, которые позволяют вам читать частичные данные.

readyState 4- единственное, что имеет какое-либо значение.

(*: о единственном возможном использовании, которое я могу придумать для проверки readyState, 3- это то, что он сигнализирует о какой-то форме жизни на стороне сервера, поэтому вы могли бы увеличить количество времени, в течение которого вы ждете полного ответа, когда вы его получите.)

bobince
источник
1

onreadystatechange Сохраняет функцию (или имя функции), которая будет автоматически вызываться каждый раз при изменении свойства readyState. readyState Сохраняет состояние XMLHttpRequest. Меняется с 0 на 4:

0: запрос не инициализирован

1: соединение с сервером установлено

2: запрос получен

3: обработка запроса

4: запрос завершен и готов ответ

статус 200: «ОК»

404 Страница не найдена

омертальми
источник
0
  • 0: UNSENT Клиент был создан. open () еще не вызван.
  • 1: OPENED был вызван open ().
  • 2: HEADERS_RECEIVED send () был вызван, заголовки и статус доступны.
  • 3: ЗАГРУЗКА Загрузка; responseText содержит частичные данные.
  • 4: DONE Операция завершена.

(Из https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState)

Хуршид Ансари
источник