Angular : how to call finally() with RXJS 6
Solution 1
use
throwError
instead ofObservable.throw
, see https://github.com/ReactiveX/rxjs/blob/master/docs_app/content/guide/v6/migration.md#observable-classesfinally
was renamed tofinalize
and you'll use it insidepipe()
among other operators.the same with
publish()
andrefCount()
. Both are operators you'll use insidepipe()
.
Solution 2
Need to import finalize
from rxjs/operators
.
import { finalize } from 'rxjs/operators';
Then finalize is used inside the pipe()
,
observable()
.pipe(
finalize(() => {
// Your code Here
})
)
.subscribe();
Solution 3
According to official document, You should change your code like this to avoid compile error: (You must throw exception in catchError
method. finalize
callback method has no argument.)
import { catchError, finalize } from 'rxjs/operators';
return next.handle(clonedreq).pipe(
catchError(error => {
console.log('error occured:', error);
throw error;
}),
finalize(() => {
console.log('finalize')
})
);
It is successfully compiled in Angular CLI: 7.1.4.
Sunil Kumar
Updated on June 01, 2020Comments
-
Sunil Kumar almost 4 years
I was using RXJS 5, now as I upgraded it to 6, I am facing some problems.
Previously I was able to use catch and finally but as per update catch is replaced with catchError (with in the pipe) now how to use finally?
Also I have some questions :
Do I need to change throw->throwError (in below code Observable.throw(err);)
import { Observable, Subject, EMPTY, throwError } from "rxjs"; import { catchError } from 'rxjs/operators'; return next.handle(clonedreq).pipe( catchError((err: HttpErrorResponse) => { if ((err.status == 400) || (err.status == 401)) { this.interceptorRedirectService.getInterceptedSource().next(err.status); return Observable.empty(); } else { return Observable.throw(err); } }) //, finally(() => { // this.globalEventsManager.showLoader.emit(false); //}); );
Also how to use publish().refCount() now ?