Как создать универсальную функцию-обертку для обработки саговых ошибок? - PullRequest
0 голосов
/ 08 февраля 2019

Я хотел бы создать оболочку, которая будет обрабатывать предложения try-catch в моих сагах, чтобы сделать их немного более краткими.Пока у меня есть код ниже, но он не работает.

export function* withErrorHandler(fn, errorFn) {
  try {
    fn();
  } catch (e) {
    yield put(errorFn(parseError(e)));
  }
}

export function* logoutSaga() {
  yield withErrorHandler(function*() {
    yield put(logoutRequest());
    yield call(api.logout);
    yield localStorage.clear();
    yield put(logoutSuccess());
  }, logoutFailure);
}

1 Ответ

0 голосов
/ 08 февраля 2019

Зачем вам обертка?Просто поместите его в блок try / catch:

export function* logoutSaga() {
  try {
    yield put(logoutRequest());
    yield call(api.logout);
    yield localStorage.clear();
    yield put(logoutSuccess());
  } catch(e) {
    yield put(logoutFailure(parseError(e)));
  }
}

Кроме того, вы можете полностью исключить необходимость разбора ошибок, поместив функции API в оболочку.Например:

class ApiError {
    constructor(err, helpful) {
        this.original = err;
        this.helpful = helpful;
    }
}

const logout = () => { 
    try {
        return axios.post("accounts/logout/");
    } catch (err) {
        throw new ApiError(err, 'There was a problem logging out.');
    }
}

Затем в ваших функциях обработки ошибок вы можете проверить, является ли выброшенная ошибка "instanceof ApiError", и отобразить err.helpful для конечного пользователя.Вы можете пойти еще дальше к конструктору ApiError, проанализировать исходную ошибку и изменить this.helpful в зависимости от возвращенного результата.

...