Как справиться с ошибками с помощью Redx Saga - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь обрабатывать ошибки с помощью Redx Saga. Далеко теперь его всегда возвращая ошибка 404, когда я изменил URL-адрес API. Я организовал свою редукторную и редукционную саги. но я не могу достать предмет Это мой редуктор

const homeReducer = (state : Object = initialState, action : Object) => {

  switch (action.type) {
    case HOME.GET_MOVIES_START:
      return {
        ...state,
        ProgramsLoading: true,
        fetching: true
      };

    case HOME.GET_MOVIES_FINISH:
      return {
        ...state,
        ProgramsLoading: false,
        programs: action.programs,
        fetching: true
      };
    case HOME.GET_MOVIES_REJECTED:
      return {
        ...state,
        ProgramsLoading: false,
        fetching: false
      };
    default:
      return state;
  }

};

И это моя Redux Saga. Есть вызов api с axios. И манипулировать данными там

function* getPrograms() {
  const { data } = yield call(axios.get, "http://localhost:3000/entries");
  const fetching = false;
  const defaultValue = {
    SeriesFilteredData: [],
    MoviesFilteredData: []
  };
  const reducerFunction = (accumulator, currentValue) => {

    if (currentValue.releaseYear < 2010) {
      return accumulator;
    }
    if (currentValue.programType === "series") {
      accumulator.SeriesFilteredData.push(currentValue);
    }
    else if (currentValue.programType === "movie") {
      accumulator.MoviesFilteredData.push(currentValue);
    }
    return accumulator;
  };
  const results = data.reduce(reducerFunction, defaultValue);

  if (results) {
    yield put(homeActions.getProgramsFinish(results));
  }
  else {
    yield put(homeActions.getProgramsRejected({ ProgramsLoading: false }));
  }

}
function* homeFlow() {
  console.log(getPrograms, "getPrograms");
  yield call(delay, 2000);
  yield call(getPrograms);
}

export default function* homeSaga() {
  yield takeEvery(HOME.GET_MOVIES_START, homeFlow);
}

Как я могу справиться с любыми ошибками?

1 Ответ

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

Поместите все свои функции getPrograms в try catch и запустите (поместите) действие homeActions.getProgramsRejected({ ProgramsLoading: false }) в блоке перехвата

function* getPrograms() {
    try {
        const { data } = yield call(axios.get, "http://localhost:3000/entries");

        // ... the rest of your code

        if (results) {
          yield put(homeActions.getProgramsFinish(results));
        }
        else {
          yield put(homeActions.getProgramsRejected({ ProgramsLoading: false }));
        }
    }
    catch(error) {
        yield put(homeActions.getProgramsRejected({ ProgramsLoading: false }));
    }
}

Тогда вы сможете улучшить его, избегая записи двух идентичных yield put(homeActions.getProgramsRejected({ ProgramsLoading: false })); звонки.Взгляните

function* getPrograms() {
    try {
        const { data } = yield call(axios.get, "http://localhost:3000/entries");

        // ... the rest of your code

        if (results) {
          yield put(homeActions.getProgramsFinish(results));
        }
        else {
            throw new Error('No results');
        }
    }
    catch(error) {
        yield put(homeActions.getProgramsRejected({ ProgramsLoading: false }));
    }
}
  • , если вызов axios не удался, блок catch помещает действие homeActions.getProgramsRejected
  • , если оно не дает сбоя, но его нетрезультаты (ваше начальное управление) выдает новую ошибку, и, опять же, блок catch помещает действие homeActions.getProgramsRejected

Дайте мне знать, если это поможет вам ?

...