4

所以我使用纯javascript(没有jquery)将文件发送到服务器。服务器脚本 PHP 最后返回状态码 200,但 javascript 正在准备就绪状态 == 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

4

1 回答 1

9

首先,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;
    }
}

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

于 2014-10-17T07:25:19.450 回答