首页 文章

处理未定义值上的 mergeMap observable

提问于
浏览
0

我正在使用 angular 6 并且有一个类将我的 API 令牌加入到每个 http 请求中。当getIdToken()成功返回时,一切都会正常,但如果它返回失败,我的应用程序将停止。

getToken失败时,如何处理mergeMap函数?

我对处理 mergeMap observable 函数很困惑。

这是我的班级:

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);
            }
        );
    }
}

这些是来自 userService 类的 getToken 函数:

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

    尝试在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);
                }
            );
    }
    

相关问题