The ngrx
infrastructure subscribes to the effect via the provider imported into the app’s NgModule
using EffectsModule.run
.
When the observable errors and catch
returns a empty obervable, the composed observable completes and its subscribers are unsubscribed – that’s part of the Observable Contract. And that’s the reason you see no further handling of LOGIN
actions in your effect. The effect is unsubscribed on completion and the ngrx
infrastructure does not re-subscribe.
Typically, you would have the error handling inside the flatMap
(now called mergeMap
):
import { Actions, Effect, toPayload } from "@ngrx/effects";
@Effect()
login$ = this.actions$
.ofType('LOGIN')
.map(toPayload)
.flatMap(payload => Observable
.from(Promise.reject('Boom!'))
.catch(error => {
console.error('Error at login', error);
return Observable.empty();
})
});
The catch
composed into the inner observable will see an empty observable flattened/merged into the effect, so no action will be emitted.