Почему не удается отловить ошибку в генераторе Redx-Saga? - PullRequest
0 голосов
/ 14 марта 2019

Вот store / store.js

...

const initSagaMiddleware = createSagaMiddleware();

const middlewares = [initSagaMiddleware, fetchPhotosMiddleware, putPhotoMiddleware];
const middlewareEnhancer = applyMiddleware(...middlewares);

...

initSagaMiddleware.run(rootSaga);

export default store;

sagas / api-saga.js

export default function* rootSaga() {
    yield all([
        photoWatcher()
    ]);
}

function* photoWatcher() {
    yield takeEvery(PUT_PHOTO, putPhotoWorker);
}

function* putPhotoWorker(action) {
    try {
        const payload = yield call(putPhoto, action.urlParams, action.body);
        yield put({ type: PHOTO_UPDATED, payload });
    } catch (err) {
        yield put({ type: API_ERROR_PUT_PHOTO, payload: err });
    }
}

и services / api.js

export function putPhoto(urlParams, body) {
    return axios.put('/abc/' + urlParams.key + '/def/' + urlParams.id + '/edit', body)
        .then(res => {
            return res.data;
        })
        .catch(err => err);
}

Моя проблема в том, что даже когда я получаю сообщение об ошибке из API-интерфейса, redux-saga put ting PHOTO_UPDATED вместо API_ERROR_PUT_PHOTO.Что я делаю неправильно?Как отловить ошибку?

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Проблема в том, что вы пытаетесь поймать одну и ту же ошибку дважды. Просто удалите перехват из функции putPhoto, и она должна работать.

export function putPhoto(urlParams, body) {
    return axios.put('/abc/' + urlParams.key + '/def/' + urlParams.id + '/edit', body)
        .then(res => {
            return res.data;
        });
}
0 голосов
/ 16 марта 2019

Обе обещания then и catch в putPhoto func привели к выражению try. Из-за этого я отказываюсь от try...catch, вместо этого сейчас использую оператор if...else. Как это:

function* putPhotoWorker(action) {
    const payload = yield call(putPhoto, action.urlParams, action.body);
    if (isResponseTypeWhatIExpected) {
        yield put({ type: PHOTO_UPDATED, payload });
    } else {
        yield put({ type: API_ERROR_PUT_PHOTO, payload });
    }
}
...