Где лучше всего изменить реакцию бэкэнда с помощью redux-saga? - PullRequest
0 голосов
/ 22 января 2019

У меня есть функция, которая подготавливает ошибки из бэкэнда, чтобы их было легко отображать в компонентах - она ​​называется prepareErrorMessages.Он принимает ответ от бэкэнда и какое-то сообщение об ошибке по умолчанию.

Итак - в саге у меня так:

function* updateSomethingFlow(action) {
  try {
    const response = yield call(updateSomething, action.payload);
    if (response) {
      yield put({
        type: UPDATE_SUCCESS
      });
    }
  } catch (err) {    
    yield put({
      type: UPDATE_FAILURE,
      payload: prepareErrorMessages(err, 'Failed to update. Please, try again.')
    });
  }
}

Итак - я ошибаюсь, чтобы изменить ошибки из бэкэнда здесь?

Или лучше сделать это в редукторе?

case UPDATE_FAILURE:
  nextState = {
    ...state,
    loading: false,
    errors: prepareErrorMessages(payload, 'Failed to update. Please, try again.'),
  };
break;

А также - почему там лучше обновить?

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Мы используем Transformer для преобразования ответа, получаемого от API.Трансформатор - это функция, которая принимает входной сигнал и обеспечивает желаемый выходной сигнал.Проектирование преобразователя делает код чистым и простым для тестирования.
Например: -

function* updateSomethingFlow(action) {
  try {
    const response = yield call(updateSomething, action.payload);
    // after getting the response from the api pass through the transformer.
    const transformedResponse =apiTransformer(action.payload);
    if (response) {
      yield put({
        type: UPDATE_SUCCESS,
        data: trasnformedResponse
      });
    }
  } catch (error) {    
    yield put({
      type: UPDATE_FAILURE,
      error: error)
    });
  }
}

const apiTransformer = function(apiResponse) {
   // implement the logic. This function returns the transformed Response

 }

Используя это, вы можете освободить редуктор от ошибки .Делает код тестируемым и облегчает имитацию.

Для глобальных ошибок бэкэнда создайте глобальный обработчик ошибок с использованием Redux Middleware, как это

const errorTracking = store => next => action => {
  if (/_FAILURE$/.test(action.type)) {
    const errorCode = parseInt(
      _.get(action, ['error', 'response', 'status'])
    )
    // this was for my use case
    if (errorCode === 403) {
     // launch an Global error handler action
      return next(ErrorHandlerAction())
    } else return next(action)
  }
  return next(action)
}

Хотя для не родовых ошибок Вы можете реализовать HOC, оберните его вокругкомпонент для визуализации.Таким образом, вы можете иметь глобальную реализацию для ошибок.

0 голосов
/ 22 января 2019

Лично я предпочел бы иметь это в саге, потому что я думаю, что это правильное место для обработки такой логики.

Я предпочитаю, чтобы мои редукторы отвечали только за изменение состояния, а не за данныетрансформация.

Но это мое личное мнение.

0 голосов
/ 22 января 2019

Лично я считаю правильным делать это в редукторе.

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

Не понимаю, почему вы не можете преобразовать / изменить полученные данные там.

...