Почему XmlHttpRequest readyState = 2 на 200 HTTP-код ответа

Поэтому я использую простой javascript (без jquery), чтобы отправить файл на сервер. Серверный скрипт PHP возвращает код состояния 200 в конце, но вместо этого javascript получает readyState == 2.

Код 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??

1 ответ

Во-первых, onreadystate не только уволен один раз. Он запускается несколько раз, вы должны быть в состоянии справиться с этим. Вот коды, которые вы должны обработать:

0 UNSENT - open () еще не был вызван
1 OPENED - send() еще не был вызван
2 HEADERS_RECEIVED - функция send() была вызвана, а заголовки и статус доступны
3 ЗАГРУЗКА Загрузка; - responseText содержит частичные данные
4 - операция завершена

Ваш код находится в блоке else на readyState == 2 (полученные заголовки) и предполагая, что это состояние ошибки, когда это не так.

Ваша проверка ошибок должна быть внутри request.readyState == 4 проверять. Таким образом, запрос выполнен, но могла также быть ошибка:

if (request.readyState == 4) {
    switch(request.status) {
        case '200':
            message = "Data uploaded successfully.";
        break;
        // Error handling here
        default: alert( "Unexpected error:  " + this.statusText + ".\nPlease try again"); break;
    }
}

https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest

Другие вопросы по тегам