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++
}
 | 
	
		
 XMLHttpRequest – это класс, его представитель создаётся при помощи ключевого слова new, и, присваивается, например, переменной xhr. 
	Цитата: 
	
 Вы можете получить статус тогда, когда получены заголовки. (это происходит тогда, когда 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, оно предназначено как раз для совместного использования! Цитата: 
	
  | 
	
		
 я почти разобрался 
	этот метод делает рекурсивный вызов и похоже подмену документа освобождая память от своей работы поэтому переменная в обработчике запроса остаётся не определённой почему рекурсивный первый вывод 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])  | 
	
		
 как сделать кнопку запустить? 
	 | 
| Часовой пояс GMT +3, время: 07:38. |