@SeeYou1ater

Uncaught TypeError: Cannot read properties of undefined (reading 'then')?

Есть ThunkCreator, который при успешном сохранении информации профиля возвращает код 0 и как бы всё отлично, должен выполнится .then(), который установит editMode в 'false' и информация сохранится. В ином случае диспатчит ошибку в форму и НЕ сохраняет данные и возвращает Promise.reject(), соответственно .then() не выполнится и из режима редактирования мы не выйдем. Но что то идёт не так, я пока что не понимаю, но хочется решить проблему, спокойно не усну.

Сам код:

export const saveProfileThunkCreator = (editDataAboutMe) => {
  return async (dispatch, getState) => {
    const authUserId = getState().auth.id
    let data = await profileAPI.saveProfile(editDataAboutMe)
      if (data.resultCode === 0) {
      dispatch(setUserProfileThunkCreator(authUserId))
    } else {
      dispatch(stopSubmit('AboutMeEditForm', {_error: data.messages[0]}))
      return Promise.reject()
    }
  }
}


const onSubmit = (editDataAboutMe) => {
    props.saveProfile(editDataAboutMe).then(() => {
      setEditMode(false)
    })
  }
  • Вопрос задан
  • 1403 просмотра
Решения вопроса 1
@Khalit
Дело в том что вы ничего не возвращаете в случае если result.code === 0 а по умолчанию возвращается undefined а потом вы у него вызываете метод then. Вот так должно работать
export const saveProfileThunkCreator = (editDataAboutMe) => {
  return async (dispatch, getState) => {
    const authUserId = getState().auth.id
    let data = await profileAPI.saveProfile(editDataAboutMe)
      if (data.resultCode === 0) {
      dispatch(setUserProfileThunkCreator(authUserId))
      return Promise.resolve()
    } else {
      dispatch(stopSubmit('AboutMeEditForm', {_error: data.messages[0]}))
      return Promise.reject()
    }
  }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
1. thunk (на англ.) задуман как кусок кода, который выполняется «потом» и независимо от UI.
Так что затея что-то там оборвать «в форме» кажется неправильной. Всё, что делает thunk – берёт что-то из состояния через getState() и рано или поздно меняет состояние через dispatch().

2. внутри async функции возвратить Promise.reject() — то же, что бросить Exception в обычном синхронном коде. Подробнее.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы