Catch React Native fetch ошибка без остановки приложения с красным экраном
Я создаю собственную функцию React, которая тянет HTML веб-страницы. Он отлично работает, если URL существует, и я получаю код состояния 200. Однако, когда я помещаю туда неправильный url (что-то, что получит ошибку 404), он отображает красный экран с надписью "сетевой запрос не удался."Я хотел бы поймать ошибку без остановки всего приложения и отобразить предупреждение пользователю. Как я могу это сделать?
fetchEvents() {
fetch('http://www.wrongurl.com', {
method: 'GET',
redirect: 'follow'
})
.then(function(response) {
if (response.status == 200) {
let responseText = JSON.stringify(response.text());
console.log(responseText);
}
else throw new Error('HTTP response status not code 200 as expected.');
})
.catch(function(error) {
console.error(error);
return error;
});
}
3 ответов
вот как я решил это, делая изящные ошибки, которые не сбой приложения с помощью обещаний:
в моем классе обслуживания API:
fetchEvents() {
let thisCurrentAPIService = this;
return new Promise(
function (resolve, reject) {
fetch('http://www.wrongurl.com');
.then(
function(response) {
if (response.ok) {
let responseText = JSON.stringify(response.text());
console.log(responseText);
}
else {
reject(new Error(`Unable to retrieve events.\nInvalid response received - (${response.status}).`));
}
}
)
.catch(
function(error) {
reject(new Error(`Unable to retrieve events.\n${error.message}`));
}
);
}
);
}
затем я вызываю его из моего компонента React. Если я получаю ошибку, я создаю предупреждение там.
this.state.apiService.fetchEvents()
.then(
function (value) {
console.log('Contents: ' + value);
},
function (reason) {
Alert.alert(`${reason.message}`);
});
вы можете использовать компонент оповещения из react-native.
fetchEvents() {
fetch('http://www.wrongurl.com', {
method: 'GET',
redirect: 'follow'
})
.then(function(response) {
if (response.status == 200) {
let responseText = JSON.stringify(response.text());
console.log(responseText);
}
else throw new Error('HTTP response status not code 200 as expected.');
})
.catch(function(error) {
Alert.alert(error); // Using this line
});
}
но я предпочитаю использовать тост, как на Android, чем alert.