Change the header to HTTP when you try to monitor again

I am trying to implement update tokens in an Angular2 application. I use an optimistic approach, and instead of checking whether the access token lasted before executing the request, I make a request, and if it returns the code 401, I will update the access token by requesting a new one and save it to local storage,

Here is my code snippet:

   getWithParams<T>(serviceUrl: string, params: URLSearchParams): Observable<T> {
    return super.getWithParams<T>(serviceUrl, params)
        .retryWhen((error) => {
            return error
                .filter((e) => e.status === 401)
                .scan((acc, value) => {
                    return acc + 1;
                }, 0)
                .takeWhile(acc => acc < 3)
                .flatMap(() => this.tokenRefreshService.refreshToken())
                .delay(1000);
        });
}

It is important to note that super.getWithParams sets an access token in the request headers, retrieving it from local storage.

The tokenRefreshService.refreshToken () method call gets a new access token and stores it in local storage.

, , , , super.getWithParams . .

? chainging , ?

+4
1

retryWhen() , . :

let token = 'token';
let counter = 0;

const source$ = Rx.Observable.defer(() => {
    console.log('Observable.defer(), token: ' + token);
    return Rx.Observable.of(token);
  })
  .map(token => {
    if (counter++ < 3) {
      throw new Error('invalid token');
    }
    return token;
  })
  .retryWhen((error) => {
    return error
      .filter(() => true) // or whatever...
      .do(() => token = token + 'bla'); // update the token
  })
  .map(token => { // create the request
    return "I'm a request with token: " + token;
  });


source$.subscribe(
  res => console.log(res),
  err => console.log('error: ' + err),
  () => console.log('complete')
);

-: https://jsbin.com/roduqi/5/edit?js,console

.

, Observable Observable.defer.

:

Observable.defer(), token: token
Observable.defer(), token: tokenbla
Observable.defer(), token: tokenblabla
Observable.defer(), token: tokenblablabla
I'm a request with token: tokenblablabla
complete
+3

Source: https://habr.com/ru/post/1666897/


All Articles