#react-native
#react-native
Вопрос:
Я пытаюсь перехватить ошибку из моего метода входа, а затем отобразить предупреждение в моем коде. Я получаю предупреждение о том, что «Отклонение необработанного обещания …»
export default function Login({navigation}){
const [email, setEmail] = React.useState('');
const [password, setPassword] = React.useState('');
const [showAlert, setShowAlert] = React.useState(false);
const [showAlert2, setShowAlert2] = React.useState(false);
const { signIn } = React.useContext(AuthContext);
const submit = async() => {
if (email === '' || password === '') {
setShowAlert(true);
} else {
signIn(email, password).catch(error =>
setShowAlert2(true)); // THIS NEVER GETS TRIGGERED, WHY?
}
}
...
}
Вход в систему определен в моем App.js вот так:
const authContext = React.useMemo(() => {
return {
signIn: (email, password) => {
auth().signInWithEmailAndPassword(email.email, password.password)
.then((res) => {
setIsLoading(false);
setUser(res.user.uid);
})
.catch(error => {
throw error; // This is the error that should be catched in "submit"
})
},
signUp: () => {
setIsLoading(false);
setUser("test");
},
signOut: () => {
setIsLoading(false);
auth().signOut().then(() => console.log('User signed out!'));
setUser(null);
}
};
}, []);
Как вы видите, в какой-то момент я выполняю «ошибку выброса». Это ошибка, которую я хочу перехватить в моем submit const выше.
Это ошибка, которую я получаю:
TypeError: undefined is not an object (evaluating 'signIn(email, password).catch')
Ответ №1:
Вам нужно вернуть этот auth()
вызов, а затем удалить catch
, тогда ошибка будет передана любым вызовам signIn
signIn: (email, password) => {
return auth() // add return here
.signInWithEmailAndPassword(email.email, password.password)
.then(res => {
setIsLoading(false);
setUser(res.user.uid);
})
},
Вы даже можете очистить это дальше, удалив фигурные скобки и return . Стрелка автоматически вернет следующее значение:
signIn: (email, password) =>
auth()
.signInWithEmailAndPassword(email.email, password.password)
.then(res => {
setIsLoading(false);
setUser(res.user.uid);
});
Ошибка, которую вы видите, в основном говорит о том, что он не может найти catch
метод для возвращаемого значения signIn
. Это верно, потому что в вашей версии signIn
ничего не возвращает. signIn
Функция должна возвращать обещание (которое является просто объектом с методами типа then
и catch
); если вы вернете обещание, тогда у него будет этот метод catch, который затем можно вызвать.
Комментарии:
1. хороший ответ, который помог.