Обнаружение ошибки XHR действительно связано с остановкой браузера или переходом на новую страницу

Пока моя страница загружает контент через XHR, если пользователь нажимает кнопку «Стоп» или нажимает для перехода на другую страницу, вызывается функция XHR error(). Обычно это не имеет большого значения, за исключением шока пользователя, увидевшего множество (красных) сообщений об ошибках на странице.

Сообщения действительны — действительно произошла ошибка при извлечении содержимого, — но это связано с действиями пользователя, а не сбоем системы.

Есть ли способ отличить (404 | 500 | ошибка тайм-аута) от ошибки, вызванной тем, что пользователь нажал кнопку остановки браузера?

РЕДАКТИРОВАТЬ: я использую Dojo (отсюда и ссылка на функцию ошибок), но я считаю, что это будет ситуация, обычная для любой реализации XHR. Я посмотрю на readyState объекта xhr, когда вызывается error()


person olore    schedule 18.09.2009    source источник
comment
О какой функции XHR error() вы говорите? На XmlHttpRequest экземплярах такого метода нет.   -  person JPot    schedule 18.09.2009
comment
появляется событие onerror, которое, по-видимому, поддерживается большинством браузеров. ссылка: developer.mozilla.org/en-US/docs/ Интернет/API/   -  person rogerdpack    schedule 27.10.2016


Ответы (1)


Чтобы различать ошибки HTTP (404, 401, 403, 500 и т. д.) и ошибки прерывания запроса (т. е. пользователь нажал Esc или перешел на другую страницу), вы можете проверить свойство XHR.status, если запрос был прерван. член состояния будет равен нулю:

document.getElementById('element').onclick = function () { 
  postRequest ('test/', null, function (response) { // success callback
    alert('Response: ' + response); 
  }, function (xhr, status) { // error callback
    switch(status) { 
      case 404: 
        alert('File not found'); 
        break; 
      case 500: 
        alert('Server error'); 
        break; 
      case 0: 
        alert('Request aborted'); 
        break; 
      default: 
        alert('Unknown error ' + status); 
    } 
  }); 
};

Простая функция postRequest:

function postRequest (url, params, success, error) {  
  var xhr = XMLHttpRequest ? new XMLHttpRequest() : 
                             new ActiveXObject("Microsoft.XMLHTTP"); 
  xhr.open("POST", url, true); 
  xhr.onreadystatechange = function(){ 
    if ( xhr.readyState == 4 ) { 
      if ( xhr.status == 200 ) { 
    success(xhr.responseText); 
      } else { 
    error(xhr, xhr.status); 
      } 
    } 
  }; 
  xhr.onerror = function () { 
    error(xhr, xhr.status); 
  }; 
  xhr.send(params); 
} 

Запустите приведенный выше фрагмент здесь.

person Christian C. Salvadó    schedule 18.09.2009
comment
Идеально - статус 0 был именно тем, что я искал. Спасибо. - person olore; 18.09.2009
comment
Сбой соединения также будет иметь статус 0. Не знаю, как отличить соединение, отмененное вручную, и сбой соединения. - person JaffaTheCake; 25.06.2012
comment
Что сказал Джаффа. Запрос, отклоненный политикой CORS, также имеет статус 0. Мне очень любопытно, есть ли способ определить в браузерах, имеет ли XHR статус 0 именно потому, что он был прерван браузером. - person Trevor Burnham; 07.10.2013
comment
согласен с @JaffaTheCake, в этом сценарии это не работает. Однако я использовал это решение, чтобы обойти это: > stackoverflow.com/questions/15326627/ - person wal; 11.08.2014
comment
К сожалению, второй фрагмент, похоже, дважды вызывает обработчик ошибок всякий раз, когда происходит сбой: | - person rogerdpack; 29.10.2016
comment
Есть несколько случаев для статуса 0. Я также ищу решение, которое может различать эти случаи. - person burntsugar; 04.01.2020
comment
Как получить данные запроса в ответ? - person wbook; 07.04.2020