Co oznaczają różne readystates w XMLHttpRequest i jak mogę ich używać?

113

XMLHttpRequestma 5 readyStates, a ja używam tylko 1 z nich (ostatniego, 4).

Do czego służą pozostałe i w jakich praktycznych zastosowaniach mogę ich używać?

Marius
źródło

Odpowiedzi:

172

Pełna lista readyStatewartości to:

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

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

W praktyce prawie nigdy nie używasz żadnego z nich poza 4.

Niektóre implementacje XMLHttpRequest mogą wyświetlać częściowo otrzymane odpowiedzi w responseTextmomencie readyState==3, ale nie jest to powszechnie obsługiwane i nie należy na nim polegać.

Kieron
źródło
5
Błędy w transferze nadal aktualizują readyState do 4. Jednak całkowicie przerwany transfer zresetuje readyState do 0. Zatem błąd w transferze będący wynikiem przekierowania nie jest tak naprawdę „błędem” i możesz wybrać ignorowanie logowania / zgłaszanie błędu, jeśli stan readyState xhr wynosi 0. Jest trochę kruchy, a przebieg może się różnić w zależności od tego, czy rejestrowanie każdego zdarzenia / błędu jest „must have” czy „nice to have”. Jeśli to drugie, możesz sobie pozwolić na przegranie rzadkiego zdarzenia, które może być błędem, wraz z readyState równym 0.
Greg Pettit
2
+1 dla @MattBianco za jego rady. Chciałbym również dodać, że Mozilla Developer Network MDN jest prawdopodobnie jedną z najpopularniejszych i najbardziej godnych zaufania witryn referencyjnych dla wszystkich Twoich potrzeb związanych z JavaScript / HTML / CSS. Podczas wyszukiwania w Google dodaj do zapytania „mdn”, a zaoszczędzisz sobie trochę bólu głowy.
DondeEstaMiCulo
@GregPettit, czy możemy użyć readystate 0 bez połączenia z Internetem, lub istnieją jakiekolwiek powody, dla których „Żądanie nie zostało zainicjowane”
Vishal Sharma
4
Nie jestem pewien, @vishalsharma - o ile pamiętam, readystate ma wartość 0, o ile żądanie nie zostanie zainicjowane. Następnie każde inne „zakończenie” (przez sukces lub błąd) zaktualizuje stan readystatu do 4. Tak więc utrata połączenia internetowego po rozpoczęciu transferu zmieni go na 4, a nie z powrotem na 0. Jeśli nigdy nie było połączenia internetowego, próbowano, powinna nadal wynosić 0; tylko po uścisku dłoni zmieni się na 1.
Greg Pettit,
Wyjaśnienie readyState 2 jest błędne - lub przynajmniej całkowicie mylące. Shure, żądanie zostało wysłane, ale ten stan w rzeczywistości mówi, że otrzymano wszystkie nagłówki ostatecznej odpowiedzi.
inta
32

Kieron „s odpowiedź zawiera W3Schools ref. na którym nikt nie polega, odpowiedź bobince'a podaje link, który faktycznie mówi natywną implementację IE,

więc oto oryginalna dokumentacja zacytowana, aby właściwie zrozumieć, co reprezentuje readystate:

Obiekt XMLHttpRequest może znajdować się w kilku stanach. Atrybut readyState musi zwracać bieżący stan, który musi mieć jedną z następujących wartości:

UNSENT (wartość liczbowa 0)
Obiekt został skonstruowany.

OPENED (wartość liczbowa 1)
Metoda open () została pomyślnie wywołana. W tym stanie nagłówki żądania można ustawić za pomocą metody setRequestHeader (), a żądanie można wykonać za pomocą metody send ().

HEADERS_RECEIVED (wartość liczbowa 2) Wykonano
wszystkie przekierowania (jeśli istnieją) i odebrano wszystkie nagłówki HTTP ostatecznej odpowiedzi. Obecnie dostępnych jest kilka elementów odpowiedzi obiektu.

LOADING (wartość liczbowa 3)
Odbierana jest treść jednostki odpowiedzi.

DONE (wartość numeryczna 4)
Transfer danych został zakończony lub coś poszło nie tak podczas przesyłania (np. Nieskończone przekierowania).

Proszę przeczytać tutaj: W3C Wyjaśnienie ReadyState

Vishal Sharma
źródło
@CharlesWood, wyzwanie dla mnie było tutaj Stackoverflow edytor przecen nie zaakceptuje odnieś się do w3c .. sprawdź, dlatego wstawiłem krótki adres URL z goo.gl .... nie rozumiem, dlaczego nie pozwala mi bezpośrednio wstawić w3c url ...
Vishal Sharma
Huh, właśnie wypróbowałem to w piaskownicy i wydawało się, że działa.
Charles Wood,
22

Oryginalna, ostateczna dokumentacja

0, 1i 2śledź tylko liczbę metod niezbędnych do wysłania żądania, które zostało wywołane do tej pory.

3informuje, że zaczęła napływać odpowiedź serwera. Ale kiedy używasz XMLHttpRequestobiektu ze strony internetowej, prawie nic (*) nie możesz zrobić z tymi informacjami, ponieważ nie masz dostępu do rozszerzonych właściwości, które pozwalają przeczytać częściowe dane.

readyState 4jest jedynym, który ma jakiekolwiek znaczenie.

(*: jedyne możliwe zastosowanie, jakie przychodzi mi do głowy do sprawdzania readyState 3, to sygnalizacja jakiejś formy życia na końcu serwera, więc możesz zwiększyć czas oczekiwania na pełną odpowiedź po jej otrzymaniu).

bobince
źródło
1

onreadystatechange Przechowuje funkcję (lub nazwę funkcji), która ma być wywoływana automatycznie za każdym razem, gdy właściwość readyState zmienia się. readyState Przechowuje status XMLHttpRequest. Zmiany od 0 do 4:

0: żądanie nie zostało zainicjowane

1: nawiązano połączenie z serwerem

2: otrzymano żądanie

3: żądanie przetwarzania

4: żądanie zakończone i odpowiedź jest gotowa

status 200: „OK”

404: nie znaleziono strony

omertalmi
źródło
0
  • 0: UNSENT Klient został utworzony. open () jeszcze nie wywołany.
  • 1: OTWARTE open () zostało wywołane.
  • 2: HEADERS_RECEIVED send () został wywołany i dostępne są nagłówki i status.
  • 3: ŁADOWANIE Pobieranie; responseText przechowuje częściowe dane.
  • 4: DONE Operacja jest zakończona.

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

Khurshid Ansari
źródło