Angular 2 RxJS Observable: RetryWhen filter retry on error Status

后端 未结 1 1934
我在风中等你
我在风中等你 2020-12-11 06:50

I am using Angular 2 HTTP library which returns an observable. I want to implement retry on certain error status/code.

I have an issue, if the error is not 429,

相关标签:
1条回答
  • 2020-12-11 07:29

    A little late to the party but, I recently implemented a similar behaviour. 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 the refresh 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();
            });
    }
    

    The use case is that whenever I make an HTTP request and get a 401 response, I want to do a token refresh and then retry the initial request with the new token. When a 401 occurs I use switchMap to return a new Observable, otherwise, I return an Observable.throw(x) that stops the retry logic from being executed.

    And the calling code looks like this (where error is called whenever you return an Observable.throw(x)):

     this.http.post(x).subscribe(response => {
          ...
            }
        }, error => {
            ...
            }
        });
    
    0 讨论(0)
提交回复
热议问题