2014-10-17 63 views
2

所以我使用普通的JavaScript(没有jQuery),将文件发送到服务器。服务器PHP脚本返回状态码200结尾,而是JavaScript是越来越readyState的== 2为什么XmlHttpRequest readyState = 2在200 HTTP响应代码

的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(即其他块始终打)

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

回答

6

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

0 UNSENT - 的open()没有被调用尚未
1日开业 - 的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

+0

我知道'onreadystate'击中多次 - 其实随时readyState的变化。具体来说,我想知道为什么** readyState不是4 **当我发回HTTP 200?那么操作**是否完成?如果不是,服务器脚本必须给出什么指示才能获得'readyState == 4'? _EDIT:_您的代码将因HTTP状态200上的readyState == 2而失败。 – snowbound 2014-10-17 07:29:17

+0

您的readyState最终可能会击中完成的块。它只是在它收到错误时首先触及“错误”部分。当收到响应时它应该总是收到* done * - 它的错误是否由响应代码定义。更新回答以更好地解释, – CodingIntrigue 2014-10-17 07:31:18

+0

我的代码不会失败。当返回任何*状态代码时,readyState * * * 2(当收到头部时)**和** 4(当响应已经下载)。 – CodingIntrigue 2014-10-17 07:33:45

相关问题