Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 31.12.2018, 00:08
Аватар для Conus
Аспирант
Отправить личное сообщение для Conus Посмотреть профиль Найти все сообщения от Conus
 
Регистрация: 05.12.2015
Сообщений: 85

XMLHttpRequest
Доброго дня, надеюсь кому ни будь идея понятна
получить xmlhttp.status 200 в xmlhttp.readyState 1
но ответ статуса может быть только если xmlhttp.readyState 4

можно ли сделать подобную обработку запроса
спасибо заранее
var xmlhttp
			try  { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } 
			catch (e) { try {  xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) {  xmlhttp = false; } }
			if (!xmlhttp && typeof XMLHttpRequest!='undefined') { xmlhttp = new XMLHttpRequest();  }

var i = 0, out = true

 while(out)
 {  if (i == 100) { out = false }

    switch(xmlhttp.readyState)
      {    case 0 : xmlhttp.open('POST', '/', true); 
			     xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');  break;
	    case 1 : if(xmlhttp.status == 200) {  xmlhttp.send("mod=" + encodeURIComponent('sendo') );  } break;
	    case 2 : alert(2); break;  
	    case 3 : alert(3); break;
	    case 4 : alert(4); break;
	  }
 
i++

}
Ответить с цитированием
  #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, что в последнем примере и происходит!
Ответить с цитированием
  #3 (permalink)  
Старый 31.12.2018, 20:20
Аватар для Conus
Аспирант
Отправить личное сообщение для Conus Посмотреть профиль Найти все сообщения от Conus
 
Регистрация: 05.12.2015
Сообщений: 85

я почти разобрался
этот метод делает рекурсивный вызов
и похоже подмену документа освобождая память от своей работы
поэтому переменная в обработчике запроса остаётся не определённой


почему рекурсивный
первый вывод alert(response[0] + ' ' + response[1])
потом вывод в теле вызова xhr()

var xmlhttp
			try  { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } 
			catch (e) { try {  xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) {  xmlhttp = false; } }
			if (!xmlhttp && typeof XMLHttpRequest!='undefined') { xmlhttp = new XMLHttpRequest();  }


var response = [], lastReadyState;
		response[1] = document
	 function xhr() 
        {   
			var  readyState = xmlhttp.readyState;
			
			if(readyState !== lastReadyState) 
			{
				switch(readyState) 
			    {  case xmlhttp.UNSENT:  xmlhttp.open('POST', '/', true); 
  						  xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); break;

				   case xmlhttp.OPENED:   xmlhttp.send("mod=" + encodeURIComponent('sendo') );  break;

							//case xmlhttp.HEADERS_RECEIVED: break; //no coments
							//case xmlhttp.LOADING:  break; //...

				   case xmlhttp.DONE: response[0] = xmlhttp.response; alert(xmlhttp.response);  return;
				}

				lastReadyState = readyState;
			
			}
        
			 setTimeout(xhr); 
			

} 

 xhr();  
alert(response[0] + ' ' + response[1])

при чем если делать собственный вызов без тайм аута переполняется стек
Maximum call stack size exceeded
и такая же ошибка выскакивает если в функцию предавать параметры
например xhr( response[0])

Последний раз редактировалось Conus, 01.01.2019 в 01:59.
Ответить с цитированием
  #4 (permalink)  
Старый 31.12.2018, 20:23
Аватар для Conus
Аспирант
Отправить личное сообщение для Conus Посмотреть профиль Найти все сообщения от Conus
 
Регистрация: 05.12.2015
Сообщений: 85

как сделать кнопку запустить?
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли вызывать асинхронный XMLHttpRequest якобы синхронно? Или Promise потянут? Svorg AJAX и COMET 6 19.11.2018 14:23
XMLHttpRequest передача массива серверу JaneLane AJAX и COMET 5 16.05.2014 12:09
запрос на другой сайт XMLHttpRequest vscorpion Internet Explorer 9 24.12.2013 16:46
xmlHttpRequest подскажите czp AJAX и COMET 4 10.12.2012 23:23
XMLHttpRequest status=0, хотя запрос проходит. arigasa AJAX и COMET 4 15.02.2011 20:14