【问题标题】:Read promise value and pass it to next method of an observable读取承诺值并将其传递给可观察对象的下一个方法
【发布时间】:2020-10-09 01:28:45
【问题描述】:

在 Angular 9 上,我创建了以下拦截器:

@Injectable()
export class AuthorizationHeaderInterceptor implements HttpInterceptor {

  constructor(private authenticationService: AuthenticationService) { }

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

    return from(this.authenticationService.getAuthenticationHeader()).pipe(header => {

      request = request.clone({
        setHeaders: { 
          Authorization: `${header}`
        }
      });

      return next.handle(request);

    });

  }

}

authenticationService.getAuthenticationHeader() 方法返回一个Promise&lt;string&gt;,其中字符串是我需要添加到请求中的标头值。

所以我在Observable 上使用from 将Promise 转换为Observablepipe

我需要在pipe之后使用map吗?

这是实现它的正确方法吗?

【问题讨论】:

    标签: angular typescript promise rxjs observable


    【解决方案1】:

    由于您要返回一个 observable,因此适当的运算符将是 switchMap

    @Injectable()
    export class AuthorizationHeaderInterceptor implements HttpInterceptor {
      constructor(private authenticationService: AuthenticationService) { }
      intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        return from(this.authenticationService.getAuthenticationHeader()).pipe(
          switchMap(header => {         // <-- use `switchMap` here
            request = request.clone({
              setHeaders: { 
                Authorization: `${header}`
              }
            });
            return next.handle(request);
          })
        );
      }
    }
    

    【讨论】:

    • mergeMap 也是一种选择吗?还是因为来自 Promise 的值,所以 swicthMap 就足够了?
    • 这里不会有什么不同,因为 Promise 只会发出一个事件。你也可以使用concatMap。但是switchMap 在语义上会更合适。
    猜你喜欢
    • 2021-04-06
    • 2020-07-07
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多