Как обрабатывать множественные результаты отправки из-за реакции с использованием redux-thunk и try-catch? - PullRequest
0 голосов
/ 29 мая 2020

Я использую redux-thunk для вызова действий и редукторов для возврата состояний. Мои действия - это, по сути, ax ios API-запросы к серверной части. Для одного конкретного действия мне нужен набор событий, отправляемых в точном порядке, как они показаны в коде:

  1. Проверить, является ли tokenvalue, переданный пользователем, действительным (у которого есть свой собственный ax ios запрос api к коллекции токенов). Если 1. не удалось, перейти к блоку catch.
  2. Если токен действительно действителен, зарегистрируйте пользователя, используя ax ios post. если 2. не удается, перейти к блоку перехвата.
  3. Если пользователь был зарегистрирован успешно, установите токен для пользователя (таким образом, только один уникальный токен на пользователя). Если 3. не удается, перейти к блоку catch.

Чтобы реализовать их последовательно в указанном выше порядке, я помещаю их в блоки try-catch. Оказывается, я неправильно понимаю, как работает dispatch - если отправка завершается неудачно с ошибкой, она все равно выполняет последующие отправки. Любые предложения о том, как я могу это решить? :

export const register = ({name,email,password,tokenval}) => async(dispatch) =>{
try{
    await dispatch(checkTokenValidity(tokenval)); // if this fails, jump to catch block
    const res = await axios.post("/api/users", body, config); //if this fails jump to catch
    await dispatch(setUserToToken({ tokenval, userID: res.data.userID })); //if this fails jump to catch
    dispatch({
      type: REGISTER_SUCCESS,
      payload: res.data,
    });
}catch(err){
  dispatch({
      type: REGISTER_FAIL,
    });
}
};

1 Ответ

0 голосов
/ 29 мая 2020
  • убедитесь, что checkTokenValidity выдает ошибку при неудаче. При этом он автоматически переходит к блоку перехвата
  • нет необходимости использовать диспетчеризацию и ожидать подтверждения действительности токена
  • сохранять результаты API в переменных и выполнять необходимые проверки и отправлять действия соответственно.

Ваш код рефакторинга

export const register = ({ name, email, password, tokenval }) => async (
  dispatch
) => {
  try {
    const isValidToken = await checkTokenValidity(tokenval); // no need of dispatch - just make sure that the checkTokenValidity throws an error upon fail
    if(!isValidToken ){
        throw new Error('server error - invalid token')
    }
    const usersResult = await axios.post("/api/users", body, config); //if this fails jump to catch
    if(!usersResult ){
        throw new Error('server error - usersResult')
    }
    const setUserToTokenResults = await dispatch(setUserToToken({ tokenval, userID: res.data.userID })); //if this fails jump to catch
    if(!setUserToTokenResults ){
        throw new Error('server error - setUserToTokenResults')
    }
    dispatch({
      type: REGISTER_SUCCESS,
      payload: res.data,
    });
  } catch (err) {
    dispatch({
      type: REGISTER_FAIL,
      payload: {err} //<---- provide some error message to the reducer
    });
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...