代码之家  ›  专栏  ›  技术社区  ›  declan roche

重构现有的可观察项以添加条件行为

  •  0
  • declan roche  · 技术社区  · 3 年前

    我有一个现有的rxjs流,如下所示。

    const existingFlow$ = concat(firstCall$,usecaseflow$); 
    

    它使用concat调用firstCall$,然后使用caseflow$

    我想修改它,以便首先进行服务调用(日志表服务)

    根据结果,我要么调用重定向,要么继续

    我现有的流,即调用existingFlow$

    我以前在rxjs中对条件使用过filter和merge,但在本例中

    我不确定如何集成结果$flow。

    这是我不完全的尝试。

    const no1$ = this.logSheetService.getActiveLogsheet().pipe(
          share()
        );
                
    const norRedirect$ = no1$.pipe(
          filter((logsheet: Logsheet) => isRedirect(logsheet)),
          tap(() => console.log("redirected.."))
        );        
                  
    const continue$ = no1$.pipe(
          filter((logsheet: Logsheet) => !isRedirect(logsheet)),
          tap(() => console.log("continue..")),
          CALL RESULT$  !!!!!
        );
    
    continue$.merge(norRedirect$);
    

    欢迎提出任何建议。

    0 回复  |  直到 3 年前
        1
  •  0
  •   GEMI    3 年前

    通常,对于合并多个可观测值,您需要使用更高阶的映射运算符,如 switchMap , concatMap mergeMap 。在您的情况下,当您想有条件地切换到另一个可观察对象时,可以使用 switchMap 。例如:

      result$ = this.logSheetService.getActiveLogsheet().pipe(
        switchMap((logSheet) => {
          if (logSheet && isRedirect(logsheet)) {
            return of(logSheet);
          } else {
            return never();
          }
        }),
        switchMap(logSheet => this.logSheetService.print(logSheet))
      );
    

    在这个例子中,我们称 logSheetService 服务,获取结果。检查结果是否正常,我们可以继续。如果我们能继续,我们会返回结果,然后再打一次电话。如果我们不能继续,我们就回来 never() 并且下面的开关永远不会被调用。