A bit late for the party, but I recently implemented this behavior. Here is my solution:
post<T>(serviceUrl: string, data: any): Observable<T> { return Observable.defer(() => { return super.post<T>(serviceUrl, data); }).retryWhen((error) => { return this.refresh(error); }); }
And update function:
refresh(obs: Observable<any>): Observable<any> { return obs .switchMap((x: any) => { if (x.status === 401) { return Observable.of(x); } return Observable.throw(x); }) .scan((acc, value) => { return acc + 1; }, 0) .takeWhile(acc => acc < 3) .flatMap(() => { console.log('Token refresh retry'); return this.tokenRefreshService.refreshToken(); }); }
A use case is that whenever I make an HTTP request and get a 401 response, I want to update the token and then repeat the initial request with a new token. When 401 happens, I use switchMap to return a new Observable, otherwise I return Observable.throw (x), which stops the execution of the retry logic.
And the calling code looks like this (where the error is called whenever you return Observable.throw (x)):
this.http.post(x).subscribe(response => { ... } }, error => { ... } });
Radu cojocari
source share