为什么在200 HTTP响应代码上XmlHttpRequest readyState = 2

sno*_*und 2 javascript php ajax xmlhttprequest http-status-code-200

所以我使用普通的javascript(没有jquery),将文件发送到服务器.服务器脚本PHP在结尾处返回状态代码200,但是javascript正在变为readyState == 2.

PHP代码发送回状态代码200:

header('X-PHP-Response-Code: 200', true, 200);
exit;
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

甚至知道HTTP 200状态代码在前端正确返回(我得到'OK').JS脚本正在看readyState==2(即阻止总是命中)

我的理解是服务器状态码200应该给readyState == 4??

Cod*_*gue 6

首先,onreadystate不只是被解雇一次.它被多次激活,你需要能够处理它.这些是您需要处理的代码:

0 UNSENT - 尚未调用open()
1 OPENED - 尚未调用send()
2 HEADERS_RECEIVED - 已调用send(),并且标题和状态可用
3 LOADING正在下载; - 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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