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

Nik*_*ili 10 observable rxjs angular

我有 HTTP 拦截器。在那个拦截器中,在我更改请求之前,我需要打开一个加载程序。
真正让我担心的是我最终有很多switchMaps。

为什么?

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

我在装载机服务中做什么

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

Run Code Online (Sandbox Code Playgroud)

在我的拦截器中

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

所以已经有 3 个嵌套的switchMaps。在它下面,我还需要 2 或 3 个switchMaps(一个用于从存储中获取令牌,另一个用于其他用途)。基本上最终有 5switchMap秒。

问题:嵌套所有这些switchMap被认为是一种反模式吗?

sat*_*ime 3

可以使用很多,switchMap特别是当您需要异步行为时,不好的做法是接触数据流之外的东西。

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

您甚至可以省略fromifthis.loadingController.createloader.present类似PromiseswitchMap支持Observable, Promise,ArrayIterator

你的代码可能是这样的

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