Обработка mergeMap, наблюдаемая для неопределенного значения - PullRequest
0 голосов
/ 12 декабря 2018

Я использую angular 6 и у меня есть класс для присоединения моих токенов API к каждому http-запросу.Когда getIdToken() вернется успешно, все будет в порядке, но если оно вернется безуспешно, мое приложение остановится.

Как я могу обработать функцию mergeMap, когда getToken не удается?

Я запутался в обработке наблюдаемой функции mergeMap.

Это мой класс:

import { Injectable } from '@angular/core';
import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpResponse,
    HttpErrorResponse } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/of';
import 'rxjs/add/observable/empty';
import 'rxjs/add/operator/retry';
import 'rxjs/add/operator/mergeMap';
import { of } from 'rxjs';


import { UserService } from '../user/user.service';

@Injectable()
export class TokenInterceptor implements HttpInterceptor {

    private token;

    constructor(private userService: UserService) { }

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        return this.userService.getToken().mergeMap(
            (token) => {
                request = request.clone({ headers: request.headers.set('Authorization', token) });
                return next.handle(request);
            }
        );
    }
}

А это мои функции getToken из класса userService:

  public async getIdToken() {
    if (this.getCurrentUser() !== null) {
      try {
        const session = await this.getCurrentUserSession();
        return session.getIdToken().getJwtToken();
      } catch (err) {
        return Promise.reject(err);
      }
    } else {
      return Promise.reject('No Current User');
    }
  }

  public getToken(): Observable<any> {
    return Observable.fromPromise(this.getIdToken());
  }

1 Ответ

0 голосов
/ 12 декабря 2018

Попробуйте добавить улов прямо перед mergeMap следующим образом:

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    return this.userService.getToken()
        .catch(error => // manage your error here)
        .mergeMap(
            (token) => {
                request = request.clone({ headers: request.headers.set('Authorization', token) });
                return next.handle(request);
            }
        );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...