【问题标题】:In Angular rxjs when should I use `pipe` vs `map`在 Angular rxjs 中,我什么时候应该使用 `pipe` 与 `map`
【发布时间】:2017-11-29 11:58:57
【问题描述】:

我对 pipe 运算符与仅链接 map 有点困惑。以下两个示例在功能上是否相同?管道功能的目的或优势是什么?

const name = ajax
  .getJSON<{ name: string }>("/api/employees/alice")
  .pipe(
    retry(3, 1000),
    map(employee => employee.name),
    catchError(error => of(null))
  );
const name = ajax
  .getJSON<{ name: string }>("/api/employees/alice")
  .let(retry(3, 1000))
  .map(employee => employee.name)
  .catch(error => Rx.Observable.of(null));

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    使用pipe 的“新”方式称为Lettable Operators Pipeable Operators。链接运算符的“旧”方式称为使用“补丁运算符”。

    从 5.5 版开始,我们发布了“可管道操作符”,可以在 rxjs/operators 中访问(注意复数的“操作符”)。与rxjs/add/operator/* 中的“补丁”操作符相比,这些方法可以更好地仅引入您需要的操作符。

    有一些problems with the patch operators。他们还可以确保您从代码中生成的包更小。还有其他优点,请参阅documentation,它很好地涵盖了它。

    尽管您的 2 个代码示例在功能上是等效的,但要回答您的其他问题。此外,您应该尽可能使用 Pipeable Operators 而不是 Patch Operators。


    来自documentation为了完整性

    用于点链的修补运算符的问题是:

    1. 任何导入补丁运算符的库都会为该库的所有使用者增加Observable.prototype,从而创建盲依赖。如果图书馆取消了它们的使用,它们会在不知不觉中破坏其他所有人。使用 pipeables,您必须将所需的运算符导入到您使用它们的每个文件中。
    2. 直接修补到原型上的操作员不能通过汇总或 webpack 等工具“摇树”。可管道操作符将是因为它们只是直接从模块中提取的函数。
    3. 任何类型的构建工具或 lint 规则都无法可靠地检测到正在导入应用程序的未使用运算符。这意味着您可能会导入scan,但停止使用它,它仍会被添加到您的输出包中。使用可管道运算符,如果您不使用它,lint 规则可以为您挑选。
    4. 功能组合很棒。构建自己的自定义运算符变得非常容易,现在它们可以工作并且看起来就像 rxjs 中的所有其他运算符一样。您不再需要扩展 Observable 或覆盖 lift

    【讨论】:

    • 它被称为pipeable operators
    • @estus - 事实上,他们在 1 月 12 日更改了术语。
    • 但是贡献者有没有考虑过设计,因为当链接看起来很乱时,在 pipe() 下添加你的函数。
    猜你喜欢
    • 2010-12-03
    • 2018-10-21
    • 2012-03-23
    • 2010-12-30
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    相关资源
    最近更新 更多