React Native: не удается перехватить выданную ошибку

#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. хороший ответ, который помог.