代码之家  ›  专栏  ›  技术社区  ›  danday74

如何保持RXJ干燥

  •  1
  • danday74  · 技术社区  · 6 年前

    干燥(不要重复)

    observable$.pipe(
      tap(value => console.log(value)),
      map(value => value * 5),
      ... more repeated stuff
    )
    

    假设值5在代码的某些部分不同,但其他部分都相同。我是否可以对此进行某种功能化/操作以使其可重用以避免复制粘贴问题?

    我能做这样的事吗?

    observable$.pipe(
      getReusedOperators(7), // this would pipe to all above operators using 7 instead of 5
      tap((value) => console.log('im not reused and my value is', value)),
      ....
    )
    

    2 回复  |  直到 6 年前
        1
  •  6
  •   cartant    6 年前

    使用pipeable操作符要记住的一点是,它们只是获取一个observate并返回一个observate的函数,因此您可以轻松地创建可重用的操作符组合,如下所示:

    function getReusedOperators(factor) {
      return source => source.pipe(
        tap(value => console.log(value)),
        map(value => value * factor),
      );
    }
    

    对于可重用组合未参数化的情况,可以使用 pipe 功能。看我的 Combining Operators 文章中有一些例子。

        2
  •  2
  •   GreyBeardedGeek    6 年前

    如果您想要可以添加到管道中的可重用的内容,可以编写返回OperatorFunction(在rxjs中定义)的方法。管道运算符将一个或多个运算符函数作为参数。

    下面是我在应用程序中使用的其中一个示例:

      /*
       * Returns an "OperatorFunction", suitable for passing to rx.pipe(),
       * that maps a Role[] to a sorted FormRole[] (sorted by role name)
       */
      public rolesToSortedFormRolesMapper(): OperatorFunction<Role[], FormRole[]> {
        return map((roles: Role[]) => roles.map((role) =>
            new FormRole(role.role, role.name, false)
          ).sort((lhs, rhs) => (lhs.name.localeCompare(rhs.name)))
        );
      }
    

    例如,它可以与,

    someObservable.pipe(rolesToSortedFormRolesMapper())