Тема: XMLHttpRequest
Показать сообщение отдельно
  #2 (permalink)  
Старый 31.12.2018, 01:28
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

XMLHttpRequest – это класс, его представитель создаётся при помощи ключевого слова new, и, присваивается, например, переменной xhr.

Сообщение от Conus
как получить xhr.status === 200 без события readystatechange
проверять периодически, не равно xhr.status ли 200.

Вы можете получить статус тогда, когда получены заголовки. (это происходит тогда, когда xhr.readyState === 2, но чтобы это не выглядело очень магический, существуют обозначения для состоянии, т. е. другими словами, это происходит тогда, когда xhr.readyState === xhr.HEADERS_RECEIVED)

без события readystatechange, но тогда придётся проверять, чтобы код работал только при изменении состояния (кроме xhr.LOADING, но вы поняли)

плохой пример
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
</head>
<body>
	<script>
		
		const xhr = new XMLHttpRequest();
		let i = 0, readyState, lastReadyState;
		
		(function xhrLoop() {
			let readyState = xhr.readyState;
			
			if(readyState !== lastReadyState) {
				switch(readyState) {
					case xhr.UNSENT:
						xhr.open("GET", "https://yesno.wtf/api", true);
						break;

					case xhr.OPENED:
						xhr.send(null);
						break;

					case xhr.HEADERS_RECEIVED:
						console.log(xhr.status);
						break;

					case xhr.LOADING:
						break;

					case xhr.DONE:
						console.log(xhr);
						return;
				}

				lastReadyState = readyState;
			}
			
			setTimeout(xhrLoop);
		})();

	</script>
</body>
</html>


но, конечно же более правильно использовать именно событие readystatechange, оно как раз происходит только при изменении состояния

хороший пример
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
</head>
<body>
	<script>
		
		const xhr = new XMLHttpRequest();
		
		xhr.open("GET", "https://yesno.wtf/api", true);
		xhr.send(null);
		
		xhr.addEventListener("readystatechange", event => {
			switch(xhr.readyState) {
				case xhr.HEADERS_RECEIVED:
					console.log(xhr.status);
					break;

				case xhr.LOADING:
					break;

				case xhr.DONE:
					console.log(xhr);
					break;
			}
		}, false);

	</script>
</body>
</html>


Вообще событие readystatechange является частью интерфейса XMLHttpRequest, оно предназначено как раз для совместного использования!

Сообщение от Conus
получить xhr.status 200 в xmlhttp.readyState 1(это тоже самое, что xhr.OPENED)
Вы статус не получите до тех пор, пока не произойдёт xhr.readyState === xhr.HEADERS_RECEIVED, что в последнем примере и происходит!
Ответить с цитированием