ionic 3 с angular 5 Запрос повторной попытки перехватчика Http не работает

Я работаю над приложением, используя аутентификацию токена с токеном обновления. Я успешно реализовал токен аутентификации и обновления в angular v1 в веб-приложении. В приложении ionic 3, использующем angular v5, я также реализовал этот процесс. Он успешно получает новый токен с помощью токена обновления. Но проблема в том, что он не вызывает последний запрос снова.

вот моя реализация перехватчика Http.

@Injectable()
export class HttpsRequestInterceptor implements HttpInterceptor {
isRefreshingToken: boolean = false;
tokenSubject: BehaviorSubject<string> = new BehaviorSubject<string>(null);

constructor(
    private injector : Injector
) {

}

addToken(req: HttpRequest<any>, token: string): HttpRequest<any> {
    return req.clone({ setHeaders: { Authorization: 'Bearer ' + token }})
}

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> {

    const authenticationService = this.injector.get(AuthenticationService);

    let user : AuthenticatedUser = authenticationService.getUser1();

    console.log("token", (user)? user.token : null);

    let dupReq: HttpRequest<any>;

    if (user && req.urlWithParams.indexOf("/token") < 0) {

        dupReq = this.addToken(req, user.token);

    } else {
        dupReq = req;
    }

    return next.handle(dupReq).pipe(
        tap(event => {
            if (event instanceof HttpResponse) {

            console.log(`Request for ${dupReq.urlWithParams} return status text : ${event.statusText} .`);
            }
        }, error => {
            if (error instanceof HttpErrorResponse) {
                switch ((<HttpErrorResponse>error).status) {

                    case 401:
                        return this.handle401Error(dupReq, next);
                }
            } else{
                return Observable.throw(error);
            }
        })
    )
}

handle401Error(req: HttpRequest<any>, next: HttpHandler) {

    if (this.isRefreshingToken == false) {
        this.isRefreshingToken = true;

        this.tokenSubject.next(null);

        const authenticationService = this.injector.get(AuthenticationService);

        return authenticationService.refreshToken().then((result: ResultSet) =>{

            this.isRefreshingToken = false;

            if (result.isSuccess) {

                console.log(result.message, result.model.token);

                let user: AuthenticatedUser  = result.model;
                this.tokenSubject.next(user.token);
                return next.handle(this.addToken(req, user.token));
            } 
            // TODO logout.
        }).catch((error: ResultSet) =>{
            this.isRefreshingToken = false;

            // TODO logout.
        });
    } else {
        return this.tokenSubject
                        .filter(token => token != null)
                        .take(1)
                        .switchMap(token => {
                            return next.handle(this.addToken(req, token));
                        });
    }
}};

Кто-нибудь знает, почему перехватчик не повторяет последний запрос снова.

Спасибо


person ali    schedule 11.07.2018    source источник
comment
Никто не подскажет, в чем может быть проблема?   -  person ali    schedule 13.07.2018
comment
В каком случае вам нужно сделать повторную попытку?   -  person Paresh Gami    schedule 17.07.2018
comment
У вас сумасшедшая смесь rx и промисов, попробуйте использовать rx для всех, чтобы это было более очевидно, трудно сказать, как эти промисы и rx взаимодействуют   -  person Dmytro Grynets    schedule 17.07.2018
comment
@PareshGami После того, как я вызову refreshToken и получу новый токен, я хочу повторить последний http-запрос.   -  person ali    schedule 17.07.2018
comment
кажется, вы сделали обработку ошибок в tap? вы должны использовать catchError для этого..   -  person Suraj Rao    schedule 21.07.2018
comment
Возможный дубликат stackoverflow. ком/вопросы/45202208/   -  person k.s.    schedule 23.07.2018