Javascript 为什么XmlHttpRequest readyState=2 on 200 HTTP响应代码

Javascript 为什么XmlHttpRequest readyState=2 on 200 HTTP响应代码,javascript,php,ajax,xmlhttprequest,http-status-code-200,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; javascript正在做: request.onreadystatechange = function() { if (request.readyState == 4)

因此,我使用纯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状态码在前端正确返回(我得到“OK”)。JS脚本看到的是
readyState==2
(即else块始终命中)


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

首先,
onreadystate
不只是触发一次。它已经发射多次了,你需要能够处理它。以下是您需要处理的代码:

尚未调用0 UNSENT-open()
1已打开-尚未调用send()
已调用2个标题\u RECEIVED-send(),标题和状态可用
3下载;及responseText保存部分数据
4-操作已完成

您的代码在
readyState==2
(接收到标题)上命中else块,并假设这是一个错误状态,而不是

错误检查应该在
请求内。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;
    }
}

我意识到,
onreadystate
点击了多次——实际上,任何时候readyState都会发生变化。具体地说,我想知道为什么我发回HTTP 200时readyState不是4?到那时手术还没有完成吗?如果不是,服务器脚本必须给出什么指示符才能获取
readyState==4
?编辑:您的代码将失败,因为HTTP状态为200时readyState==2。您的readyState可能最终命中了已完成的块。只是当它收到错误时,它会首先命中“错误”部分。当收到响应时,它应该总是收到一个done,不管它是否是一个错误,都是由它的响应代码定义的。更新答案,更好地解释我的代码不会失败。当返回任何状态代码时,readyState既为2(接收到标头时),也为4(下载响应时)。