Итак, я использую простой javascript (без jquery), чтобы отправить файл на сервер. Сценарий сервера PHP возвращает код состояния 200 в конце, но вместо этого Javascript становится readyState == 2.Почему XmlHttpRequest readyState = 2 на 200 HTTP-код ответа
код PHP отправляет код состояния 200:
header('X-PHP-Response-Code: 200', true, 200);
exit;
Javascript делает:
request.onreadystatechange = function() {
if (request.readyState == 4) {
var message;
switch(request.status) {
case '200':
message = "Data uploaded successfully.";
break;
case '406':
message = "Incorrect file format. Please try again.";
break;
case '410':
message = "Unexpected error. Please contact support.";
break;
default:
break;
}
status_message_container.innerHTML = message;
submit_button.disabled = false;
}
else {
alert("Unexpected error: " + this.statusText + ".\nPlease try again");
}
};
request.send(formData);
Даже знаю, что код статуса HTTP 200 возвращается правильно (я получаю «ОК») на интерфейсе. Сценарий JS видит readyState==2
(т. Е. Блок блокировки всегда попадает)
Я понимаю, что код состояния сервера 200 должен давать readyState == 4
??
Я понимаю, что 'onreadystate' хиты несколько раз - в любое время изменения readyState в самом деле. В частности, мне интересно, почему ** readyState не 4 ** при отправке HTTP 200? К тому времени не завершена ли ** операция? Если нет, какой индикатор серверный скрипт должен дать, чтобы получить 'readyState == 4'? _EDIT: _ Ваш код не сработает, потому что readyState == 2 по статусу HTTP 200. – snowbound
Ваш readyState, вероятно, действительно ударил по завершенному блоку. Просто он сначала попадет в «ошибку», когда получит ошибку. Он должен всегда получать * сделан * при получении ответа - независимо от того, является ли это ошибкой, определяемой кодом ответа. Обновленный ответ, чтобы лучше объяснить, что – CodingIntrigue
Мой код не подведет. readyState * * * (при получении заголовков) ** и ** 4 (когда ответ был загружен), когда возвращается * любой код состояния *. – CodingIntrigue