Я использую redux-observable
для отправки действия с преобразованием некоторого результата обещания.
Допустим, у меня есть такой вызов API:
const fetchSomething = () => callAndReturnPromise('some-endpoint')
Используя эти создатели действий:
const fetchSomethingSuccess = response => ({ type: 'SUCCESS', payload: response })
const fetchSomethingError = error => ({ type: 'ERROR', payload: error })
Я могу создавать действия для обоих случаев, когда fetchSomething
разрешено или отклонено.
Я хочу, чтобы мой эпик выполнял все действия FETCH и использовал функцию fetchSomething
, чтобы поместить новый узел с разрешенным или отклоненным значением обещания с использованием соответствующих создателей действий.
Моя эпопея выглядит так:
const fetchSomethingEpic = action$ =>
action$
.ofType('FETCH')
.switchMap(() =>
Observable
.fromPromise(fetchSomething())
.map(fetchSomethingSuccess)
.catch(error => Observable.of(fetchSomethingError(error)))
);
Проблема в том, что он перестает работать при возникновении ошибки.
Когда обещание, сгенерированное fetchSomething
, выполняется, все идет нормально, отправляется новое действие с преобразованием, переданным с помощью map. Но когда обещание отклоняется, после FETCH никаких действий не отправляется.
--
Больше информации
callAndReturnPromise('some-endpoint)
выглядит так:
const callAndReturnPromise = endpoint => new Promise((resolve, reject) => {
fetch(endpoint)
.then(response => {
if (checkIsCool(response)) {
resolve(response);
} else {
reject(response)
}
})
})
После отладки я получаю что-то вроде этого, давайте назовем действия в потоке с помощью F, S, E (выборка, успех и ошибка)
----F----S------F-------F------S
^ there occurred an error but no action was sent