普通に書こうとすると失敗する
catchErrorオペレータを使い、ofでくくったActionを返します
サンプルコード(失敗します)
const sampleEpic = action$ =>
action$.pipe(
filter(sampleAction.match),
tap(() => {
throw new Error('oops!'); // エラー発生
}),
catchError(error =>
of(errorHandlingAction(error.message)) // Actionを返す
)
);
しかし、一回catchErrorをしたのを最後に、このEpicは死んでしまいました![]()
しばらくハマったのですが、redux-observableのcatchErrorでactionを返すと、rootEpicがそのEpicの購読をやめてしまうようです![]()
解決策
issueに解決策がありました。
catchError((error, caught) => merge(
of({ type: 'EPIC_FAILURE', error }),
caught,
)),
なるほど、一緒にcaughtもすればいいんですね![]()
サンプルコード(修正版)
const sampleEpic = action$ =>
action$.pipe(
filter(sampleAction.match),
tap(() => {
throw new Error('oops!'); // エラー発生
}),
catchError((error, caught) =>
merge(of(errorHandlingAction(error.message)), caught) // caughtする!
)
);