Javascript 为什么XmlHttpRequest readyState=2 on 200 HTTP响应代码
因此,我使用纯javascript(无jquery)将文件发送到服务器。服务器脚本PHP在末尾返回状态代码200,但javascript得到的是readyState==2 PHP代码发回状态代码200: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)
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(下载响应时)。