Статус HTTP не срабатывает при попытке поймать javascript

У меня есть функция отправки JSON в конечную точку API, которая работает нормально. Это мой код.

function sendValuesPageLoad(){
     var xhr = new XMLHttpRequest();
     xhr.onreadystatechange = function () {
        try {
          if (xhr.readyState === 4 && xhr.status === 200) {}
        } catch (ex) {
            alert('Error parsing response.');
        }
     }
     try {
        xhr.open("POST", "test.html?"+encodedString, true);
        xhr.setRequestHeader("Content-Type", "application/json");
        xhr.send();
     } catch (ex) {
        xhr.open("POST", "error.html?"+encodedString, true);
        xhr.setRequestHeader("Content-Type", "application/json");
        xhr.send();
     }
} 

Чего я пытаюсь добиться, так это выполнить дальнейшие действия, если xhr.status не равен 200.

Но ловушка не срабатывает.

Может ли кто-нибудь помочь в этом?

Заранее спасибо.

Вы можете использовать throw, если статус не 200.

random 12.06.2019 14:56

почему вы ожидаете, что он сработает? не может быть исключением

Philipp Sander 12.06.2019 14:57

@randomSoul не понял тебя. Можете ли вы отредактировать мой код в качестве примера?

Zain 12.06.2019 14:59

с вашим текущим кодом нет исключений, поэтому он не будет выполнять ваш блок catch. Если вы хотите выполнить свой блок catch, если статус не 200. Вы можете добавить оператор if, который проверяет, если статус не равен 200, а затем использовать внутри него оператор throw, чтобы ваш блок catch выполнялся.

random 12.06.2019 15:05
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

function sendValuesPageLoad(){
   var encodedString = "value=2";

   var xhr = new XMLHttpRequest();
   console.info('UNSENT: ', xhr.status);

   xhr.open("POST", "test.html?" + encodedString, true);
   console.info('OPENED: ', xhr.status);
   
   xhr.onprogress = function () {
     console.info('LOADING: ', xhr.status);
   };
   
   xhr.setRequestHeader("Content-Type", "application/json");
   
   xhr.onload = function () {
     console.info('DONE: ', xhr.status);
     
     if (xhr.status === 200){
        alert("Status code is 200");
        
     }else{
         alert("Status code is not 200, but " + xhr.status);
     
        xhr.open("POST", "error.html?"+encodedString, true);
        xhr.setRequestHeader("Content-Type", "application/json");
        xhr.send();
     }
   };
   
   xhr.send();  
}

sendValuesPageLoad();

я изменил свой ответ

Dontwan 12.06.2019 15:37

XMLHttpRequest имеет собственный обработчик ошибок onerror. Обновление вашего примера

function sendValuesPageLoad(){
    var xhr = new XMLHttpRequest();
    xhr.onload = function () {
       if (xhr.status === 200) {
          // successful
       } else {
          // fails
          throw new Error('Failed with status: ' + xhr.statusText);
       }
    }
    xhr.onerror = function () {
       throw new Error('There is a problem');
    }
    xhr.open("POST", "test.html?"+encodedString, true);
    xhr.setRequestHeader("Content-Type", "application/json");
    xhr.send();
}

Вы можете улучшить это, завернув его в Promise и поймав любую ошибку.

function sendValuesPageLoad(){
  return new Promise(function(resolve, reject) { 
    var xhr = new XMLHttpRequest();
    xhr.onload = function () {
       if (xhr.status === 200) {
          // successful
          resolve(xhr.response);
       } else {
          // fails
          reject(xhr.statusText);
       }
    }
    xhr.onerror = function () {
       reject(Error("Network Error"));
    }
    xhr.open("POST", "test.html?"+encodedString, true);
    xhr.setRequestHeader("Content-Type", "application/json");
    xhr.send();
  }
}

// use case
sendValuesPageLoad().then(function(response) { 
   // use your response here
}).catch(function(error) {
   // handle your error
});

Другие вопросы по теме