使用许多嵌套的switchMap是不好的做法吗?

时间:2019-02-11 20:07:50

标签: angular rxjs observable

我有http拦截器。在该拦截器中,更改请求之前,我需要先打开加载程序。
让我真正担心的是,我最终有很多切换图。

为什么?

  1. 加载程序是异步的
  2. 我还需要将从拦截器传递的消息转换为加载程序服务。翻译消息也是异步的。在拦截器中,我应该在加载程序和翻译完成后运行请求

我在加载程序服务中做什么

showLoader(message){
    return this.translateService.get(message).pipe(switchMap( (translatedMessage)=>{
            this.loader$ = from(this.loadingController.create({message: translatedMessage}));
            return this.loader$.pipe(switchMap((loader)=>{
              return from(loader.present());
            }));
          }));
    }

在我的拦截器中

intercept(request: HttpRequest<any>, next: HttpHandler) {
        return this.loaderService.showLoader("WAITING").pipe(
            take(1),
            switchMap( ()=>{

因此已经嵌套了3个switchmap。在它下面,我需要2到3个以上的切换图(一个用于从存储中获取令牌,另一个用于其他操作)。基本上以5个switchmap结束。

问题:嵌套所有这些switchMap是不好的做法吗?

1 个答案:

答案 0 :(得分:2)

最好使用许多switchMap,尤其是当您需要异步行为时,不良的做法是触摸数据流之外的内容。

在您的代码this.loader$中是它的一个示例,与其在流之外使用变量,不如尝试构建一个在内部执行您想要的所有事情的管道。

如果fromthis.loadingController.createloader.present一样Promise支持switchMapObservable,甚至可以忽略Promise ArrayIterator

您的代码可能就是这样

    public showLoader(message) {
        return this.translateService.get(message).pipe(
            switchMap(translatedMessage => this.loadingController.create({message: translatedMessage})),
            switchMap(loader => loader.present()),
        );
    }