【问题标题】:How to keep RxJs DRY如何保持 RxJs DRY
【发布时间】:2018-08-11 00:38:25
【问题描述】:

干燥(不要重复自己)

假设我在我的应用中经常使用此代码:

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)),
  ....
)

这里最好的方法是什么?抱歉,我的问题不太好,但希望你能明白。

【问题讨论】:

    标签: angular rxjs ngrx


    【解决方案1】:

    使用管道运算符要记住的是,它们只是接受可观察对象并返回可观察对象的函数,因此您可以轻松地创建可重用的运算符组合,如下所示:

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

    对于您的可重用组合未参数化的情况,您可以使用静态pipe 函数进行组合。有关示例,请参阅我的 Combining Operators 文章。

    【讨论】:

    • 谢谢,很好的答案 +1 - 但 GreyBeardedGeeks 的答案也很好 - 哪种方法更可取,或者它们大致相同?
    • 答案相似。另一个答案是正确且相关的。它详细说明了 TypeScript 类型 - OperatorFunction<T, R> - 表示一个函数,该函数接受 Observable<T> 参数并返回 Observable<R> 结果。并且该答案中的 sn-p 包装了一个内置运算符 - map - 而不是使用 pipe 组合多个运算符。是否将返回OperatorFunction<T, R> 的函数称为运算符,或者是否将OperatorFunction<T, R> 本身称为运算符取决于您的观点。我对两者都使用“运营商”一词。
    • 优秀的评论,将接受您的答案,因为您的答案、文章和评论结合起来对 RxJs 社区很有价值 - 最后一个问题,使用 GreyBeardedGeek 的方法,您能否在其中返回 source => source.pipe()操作员功能 - 非常感谢您的帮助
    • 我不确定你的意思。您当然可以返回source => source.pipe(),因为该表达式是OperatorFunction。哦,顺便说一句,我也有白胡子。
    【解决方案2】:

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

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

      /*
       * 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)))
        );
      }
    

    此 OperatorFunction 将一种类型的数组映射到另一种类型的数组,然后对结果进行排序。

    它可以与,例如,

    someObservable.pipe(rolesToSortedFormRolesMapper())
    

    当然,您也可以将其他运算符放入管道中。

    【讨论】:

    • thx,很好的答案 +1 - 但卡坦斯的答案也很好 - 哪种方法更可取,或者它们大致相同?
    猜你喜欢
    • 2011-06-06
    • 2013-02-15
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 2018-11-11
    • 1970-01-01
    相关资源
    最近更新 更多