O que significam os diferentes readystates em XMLHttpRequest e como posso usá-los?

113

XMLHttpRequesttem 5 readyStates, e só uso 1 deles (o último 4).

Para que servem os outros e em que aplicações práticas posso usá-los?

Marius
fonte

Respostas:

172

A lista completa de readyStatevalores é:

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

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

Na prática, você quase nunca usa nenhum deles, exceto 4.

Algumas implementações de XMLHttpRequest podem permitir que você veja respostas parcialmente recebidas em responseTextquando readyState==3, mas isso não é universalmente suportado e não deve ser invocado.

Kieron
fonte
5
Erros na transferência ainda atualizam o readyState para 4. No entanto, uma transferência completamente interrompida irá redefinir o readyState para 0. Portanto, um erro na transferência que é resultado de um redirecionamento não é realmente um "erro" e você pode escolher ignorar o registro / reportando o erro se o readyState do xhr for 0. É um pouco frágil e sua milhagem pode variar dependendo se o registro de cada evento / erro é um "obrigatório" ou um "bom ter". Se for o último, você pode perder o evento raro que pode ser um erro junto com o estado pronto de 0.
Greg Pettit
2
+1 para @MattBianco por seus conselhos. Também gostaria de acrescentar que o Mozilla Developer Network MDN é indiscutivelmente um dos sites de referência mais populares e confiáveis ​​para todas as suas necessidades de JavaScript / HTML / CSS. Ao fazer uma pesquisa no Google, inclua "mdn" antes de sua consulta e você evitará algumas dores de cabeça.
DondeEstaMiCulo
@GregPettit, podemos usar readystate 0, para nenhuma conexão com a Internet, ou há algum motivo em que "A solicitação não foi inicializada"
Vishal Sharma
4
Não tenho certeza, @vishalsharma - pelo que me lembro, o readystate é 0, desde que a solicitação não seja inicializada. Depois disso, qualquer outra "conclusão" (por sucesso ou erro) atualizará o readystate para 4. Portanto, perder a internet após o início da transferência o mudará para 4, e não para 0. Se nunca houve internet quando a transferência foi tentada, ainda deve estar em 0; ele só mudará para 1 após o handshake.
Greg Pettit,
A explicação para readyState 2 está errada - ou pelo menos completamente enganosa. Claro que a solicitação foi enviada, mas esse estado na verdade diz que todos os cabeçalhos de resposta final foram recebidos.
inta
32

kieron 's resposta contém w3schools ref. no qual ninguém confia, a resposta de bobince fornece um link, que na verdade informa a implementação nativa do IE,

então aqui está a documentação original citada para entender corretamente o que readystate representa:

O objeto XMLHttpRequest pode estar em vários estados. O atributo readyState deve retornar o estado atual, que deve ser um dos seguintes valores:

UNSENT (valor numérico 0)
O objeto foi construído.

OPENED (valor numérico 1)
O método open () foi chamado com sucesso. Durante esse estado, os cabeçalhos de solicitação podem ser definidos usando setRequestHeader () e a solicitação pode ser feita usando o método send ().

HEADERS_RECEIVED (valor numérico 2)
Todos os redirecionamentos (se houver) foram seguidos e todos os cabeçalhos HTTP da resposta final foram recebidos. Vários membros de resposta do objeto agora estão disponíveis.

LOADING (valor numérico 3)
O corpo da entidade de resposta está sendo recebido.

DONE (valor numérico 4)
A transferência de dados foi concluída ou algo deu errado durante a transferência (por exemplo, redirecionamentos infinitos).

Leia aqui: Explicação W3C de ReadyState

Vishal Sharma
fonte
@CharlesWood, o desafio para mim foi aqui o editor de markdown stackoverflow não aceita consultar w3c .. confira, portanto, coloquei um url curto de goo.gl ... não entendo por que não me permite colocar diretamente url w3c ...
Vishal Sharma
Huh, eu apenas tentei isso na caixa de areia e pareceu funcionar.
Charles Wood
22

Documentação definitiva original

0, 1E 2única acompanhar como muitos dos métodos necessários para fazer um pedido que você chamou até agora.

3informa que a resposta do servidor começou a chegar. Mas quando você está usando o XMLHttpRequestobjeto de uma página da web, não há quase nada (*) que você possa fazer com essa informação, já que você não tem acesso às propriedades estendidas que permitem você a ler os dados parciais.

readyState 4é o único que possui algum significado.

(*: quase o único uso concebível que posso pensar para verificar o readyState 3é que ele sinaliza alguma forma de vida no final do servidor, então você pode aumentar o tempo de espera por uma resposta completa quando a receber.)

bobince
fonte
1

onreadystatechange Armazena uma função (ou o nome de uma função) a ser chamada automaticamente sempre que a propriedade readyState muda. readyState Contém o status do XMLHttpRequest. Mudanças de 0 a 4:

0: solicitação não inicializada

1: conexão do servidor estabelecida

2: pedido recebido

3: solicitação de processamento

4: pedido concluído e resposta pronta

status 200: "OK"

404 Página Não Encontrada

omertalmi
fonte
0
  • 0: Cliente NÃO ENVIADO criado. open () ainda não chamado.
  • 1: OPENED open () foi chamado.
  • 2: HEADERS_RECEIVED send () foi chamado, e cabeçalhos e status estão disponíveis.
  • 3: CARREGANDO Baixando; responseText contém dados parciais.
  • 4: DONE A operação está concluída.

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

Khurshid Ansari
fonte