Как реорганизовать эту функцию, чтобы получить правильное сообщение об ошибке в блоке catch?

#javascript #reactjs #redux #try-catch

#javascript #reactjs #redux #попробуйте-catch

Вопрос:

итак, у меня есть это

 try {
  const user = await logUserInToApplication({ email, password })
  console.log(user, 'usr')
  await AsyncStorage.setItem('secureUid', user.user.uid)
  await dispatch(getCurrentUser(user.user.uid))
  setLoaded(true)
} catch (e) {
  console.log(e, 'e')
  setPassword('')
  setError(e.message)
  setLoaded(true)
}
 

но проблема в 2 вещах. во user.user.uid -первых, это некрасиво, но, во-вторых, основная проблема заключается в том, что console.log(e) выход из cannot read uid of defined системы имеет смысл, но я хочу, чтобы это была ошибка, logUserIntoApplication если это не удастся

так что я мог бы изменить его на это

 try {
   await logUserInToApplication({ email, password })
}
 

но тогда мне нужно получить значение, которое оно возвращает мне, чтобы я мог передать uid в другие функции, как мне это сделать?

Комментарии:

1. const {user} = ожидает logUserInToApplication({ email, password }); Попробуйте уничтожить. Это приведет к некоторой очистке

2. const myFunc = async () => = { try{ const {user} = await …. return user.uid } catch(e){ console.log( Error ${e.messgae} ) } } myFunc вернет uid

3. Вы должны отклонить с правильной ошибкой в logUserInToApplication . Теперь вы разрешаете его с помощью некоторого значения, у которого нет пользователя.

4. Деструктурирование не выдаст вам нужную ошибку, оно все равно выдаст вам undefined ошибку. Вы должны выдать ошибку в kigUserInToApplication функции или отклонить какую-либо ошибку, если вы используете Promise .

Ответ №1:

 try {
  const{ user } = await logUserInToApplication({ email, password })
  console.log(user, 'usr')
  if(user amp;amp; user.id){
    await AsyncStorage.setItem('secureUid', user.uid)
    await dispatch(getCurrentUser(user.uid))
  } else {
   setError('set Error message here')
  }
  setLoaded(true)
} catch (e) {
  console.log(e, 'e')
  setError(e.message)
  setLoaded(true)
}
 

Ответ №2:

Проблема в том, что ваша logUserInApplication функция не выдает ошибку;

 
try {
  const user = await logUserInToApplication({ email, password })
  console.log(user, 'usr')
     if(!user.user.uid) throw({message: "User id not found"})
  await AsyncStorage.setItem('secureUid', user.user.uid)
  await dispatch(getCurrentUser(user.user.uid))
  setLoaded(true)
} catch (e) {
  console.log(e, 'e')
  setPassword('')
  setError(e.message)
  setLoaded(true)
}

 

или вы должны выдать какую-либо ошибку или отклонить ошибку в своей logUserInToApplication функции. Что-то вроде приведенного ниже:

 const logUserInToApplication = async values => {
    try {
           const response = api.post(values);
           if(response.user.uid)
           return response.user;
           throw({ message: "User not found" })
    }
    catch(e) { throw(e); }

}