2014-10-17 5 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 возвращается правильно (я получаю «ОК») на интерфейсе. Сценарий JS видит readyState==2 (т. Е. Блок блокировки всегда попадает)

Я понимаю, что код состояния сервера 200 должен давать readyState == 4 ??

ответ

6

Во-первых, onreadystate не только уволен один раз. Он запускается несколько раз, вы должны иметь возможность справиться с этим. Это коды, которые необходимо обрабатывать:

0 НЕОТПРАВЛЕННЫЕ - открыт() не была вызвана
1 ОТКРЫТ - посыла() не была вызвана
2 HEADERS_RECEIVED - отправить() вызывается, а заголовки и статус доступны
3 ЗАГРУЗКА Загрузка; - responseText имеет частичные данные
4 - операция завершена

Ваш код удара блок еще на 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: _ Ваш код не сработает, потому что readyState == 2 по статусу HTTP 200. – snowbound

+0

Ваш readyState, вероятно, действительно ударил по завершенному блоку. Просто он сначала попадет в «ошибку», когда получит ошибку. Он должен всегда получать * сделан * при получении ответа - независимо от того, является ли это ошибкой, определяемой кодом ответа. Обновленный ответ, чтобы лучше объяснить, что – CodingIntrigue

+0

Мой код не подведет. readyState * * * (при получении заголовков) ** и ** 4 (когда ответ был загружен), когда возвращается * любой код состояния *. – CodingIntrigue