Ionic 3 как обновить представление после обновления токена

#angular #typescript #ionic-framework #ionic3

#angular #typescript #ionic-framework #ionic3

Вопрос:

У меня есть приложение Ionic 3, которое использует токен обновления. Проблема в том, что при создании нового токена доступа представление не обновляется. Другой случай, когда сценарий представляет собой обновление сервера, запрос больше не выполняется.

Angular: 5.2.7
RxJS: 5.5.6

Я изучил некоторые коды, в которых он используется switchMap() , но я не смог использовать, поскольку функция async всегда возвращает Promise<> .

Я попробовал следующий код:

[AppHttpInterceptor.ts]

 constructor(private event: Events, private authService: AuthService,
 private refreshTokenService: RefreshTokenService) { }

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    console.log("intercepted request ... ", req.url);

    return next.handle(req)
        .catch(error => {                
            if (!error.ok amp;amp; error.error.error === 'invalid_grant') {
                console.log('Logout');
                this.event.publish('logout');
            }

            if (req.url != AUTH_ENDPOINT) {
                if (error instanceof HttpErrorResponse) {
                    if (error.status !== 401)
                        return Observable.throw(error);

                    return this.authService
                        .refreshToken()
                        .then(response => {
                            console.log('Response: ', response);
                            console.log('Retrying ... ', req.url);
                            this.refreshTokenService.publish(''); // Added to each view to make them refresh the data =(.
                            return next.handle(req);
                        }).catch((err: any) => {
                            console.log('Logout');
                            this.authService.logout();
                            return Observable.throw(error);
                        });
                }
            }
        }) as any;
}
  

[auth.service.ts]

 constructor(private http: HttpClient, private storage) { }

public async refreshToken() {
    await this.storage.get('userAuth')
        .then(userAuth => { this.userAuth = userAuth });

    let params = await this.GetAuthRefreshParams(this.userAuth);
    let body = await this.encodeParams(params);

    return await this.http.post(this.authUrl, body).toPromise()
        .then((res: any) => {
            if (typeof res.access_token !== 'undefined') {
                this.userLogin = this.GetAuthResponse(res);
                this.userLogin.RefreshToken = this.userAuth.RefreshToken; // Keeps the old refresh token.
                //.
                //. Set AuthStorage and GetUserData...
                //.
                return this.userLogin;
            }
        }).catch(error => {
            console.log(error);
            return Observable.throw(error);
        });
}
  

Чего я хочу добиться, так это обновления представления после повторной попытки запроса без добавления наблюдателя на каждой странице;
Повторите запросы даже при отправке добавления / обновления на сервер.

Комментарии:

1. почему вам нужно обновлять представление при обновлении токена?

2. Поскольку в первый раз ответом будет ошибка 401 (неавторизованная), поэтому затем с помощью токена обновления будет сгенерирован новый токен доступа, тогда мне нужно повторить запрос и заставить представление отображать полученные данные.