Где должна происходить логика ответа, в саге или редукторе? - PullRequest
5 голосов
/ 08 марта 2019

Допустим, у меня есть сага, которая выглядит так:

export function* incrementAsync(action) {
  try {
    const res = yield call(Api.signin.create, action.payload);
    yield put({ 
      type: USER_SIGN_IN_FETCH_SUCCESS,
      payload: res.data.auth
    };
  } catch (e) {
    yield put({ type: USER_SIGN_IN_FETCH_ERROR_NETWORK });
  }
}

Фек был успешным, но это не значит, что пользователь действительно вошел в систему:

res.data.auth.error может быть правдой

Мой вопрос заключается в том, должен ли я делать такие вещи, как:

if (//user was succesfully logged in)
    yield put(//user was successfully logged in)
else if //wrong username
    yield put(//wrong username)
else if //wrong password
    yield put(//wrong password)

Или я должен иметь только один для успеха и один для ошибки, и в редукторе проанализировать логику ипостроить хранилище относительно данных ответа?

Ответы [ 2 ]

3 голосов
/ 09 марта 2019

Логика ошибок всегда должна обрабатываться на sagas.В этом конкретном случае ваш API не выдает правильную ошибку, потому что если ваш вызов API не был success (например, 200), эта логика должна обрабатываться в вашем операторе catch.

Почемуэта ошибка не обрабатывается там?Если вы используете axios, это может произойти из-за неправильной конструкции API (т.е. возвращает 200 вместо 400 для ошибки при входе в систему).Если вы просто делаете это вручную, вы должны выдать ошибку и обработать эту логику на catch в sagas.

Поэтому я рекомендую:

  • Бросьте error в sagas для обработки логики ошибок в операторе catch.
  • Если вам нужно проанализировать ответ, чтобы программно выдать ошибку, сделайте это вслой API, если можете.

  • Сделайте определенное действие для обработки ошибки регистрации ИЛИ просто сделайте общее действие FAIL и передайте ему сообщение об ошибке (затем сохраните его в избыточномпокажи это).

Это должно выглядеть примерно так:

export function* incrementAsync(action) {
  try {
    const res = yield call(Api.signin.create, action.payload);
    yield put({ 
      type: USER_SIGN_IN_FETCH_SUCCESS,
      payload: res.data.auth
    };
  } catch (error) {
    yield put({ type: USER_SIGN_IN_FAIL, payload: error.message });
  }
}
0 голосов
/ 09 марта 2019

Я бы всегда перемещал как можно больше логики в редуктор. Логика там более заметна в инструментах разработки, если вы делаете это в саге, это может быть сложнее. Это также легче проверить, так как это синхронная и чистая функция. Кроме того, USER_SIGN_IN_FETCH_SUCCESS кажется мне совершенно значимым для действия, отправляемого из саги в редуктор (действия от компонентов к редуктору должны быть менее техническими). ​​

...