У меня есть функция отправки 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.
Но ловушка не срабатывает.
Может ли кто-нибудь помочь в этом?
Заранее спасибо.
почему вы ожидаете, что он сработает? не может быть исключением
@randomSoul не понял тебя. Можете ли вы отредактировать мой код в качестве примера?
с вашим текущим кодом нет исключений, поэтому он не будет выполнять ваш блок catch. Если вы хотите выполнить свой блок catch, если статус не 200. Вы можете добавить оператор if, который проверяет, если статус не равен 200, а затем использовать внутри него оператор throw, чтобы ваш блок catch выполнялся.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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();я изменил свой ответ
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
});
Вы можете использовать
throw, если статус не200.