We've just upgraded one of our applications to Angular 5, and started to transition into lettable operators as introduced in rxjs v5.5.
Because of this, we have rewritten our observable pipelines to the new syntax with the .pipe()
operator.
Our previous code would look like this, with a .catch()
inside the .switchMap()
as to not interrupt the running of effects if an error is thrown.
@Effect()
loadData$ = this.actions$
.ofType(LOAD_DATA)
.map((action: LoadData) => action.payload)
.withLatestFrom(this.store.select(getCultureCode))
.switchMap(([payload, cultureCode]) => this.dataService.loadData(payload, cultureCode)
.map(result => {
if (!result) {
return new LoadDataFailed('Could not fetch data!');
} else {
return new LoadDataSuccessful(result);
}
})
.catch((err, caught) => {
return Observable.empty();
});
);
In the case of an error thrown in the call to the dataService
it would be caught and handled (simplified the error handling here).
With the new syntax and use of .pipe()
, we now have this
@Effect()
loadData$ = this.actions$
.ofType(LOAD_DATA)
.pipe(
map((action: LoadData) => action.payload),
withLatestFrom(this.store.select(getCultureCode)),
switchMap(([payload, cultureCode]) => this.dataService.loadData(payload, cultureCode)),
map(result => {
if (!result) {
return new LoadDataFailed('Could not fetch data!');
} else {
return new LoadDataSuccessful(result);
}
})
);
How can I in a similar fashion catch any thrown errors in the observable pipeline, using the new syntax?
map
out ofswitchMap
projection, so any error will close the outer stream. Something like:switchMap(([payload, cultureCode]) => this.dataService.loadData(payload, cultureCode).pipe(map..., catch...))
should do the job. – artur grzesiak