【问题标题】:Difference between RxJS and IxJS?RxJS 和 IxJS 的区别?
【发布时间】:2019-04-01 11:29:53
【问题描述】:

RxJS 和 IxJS 有什么区别,我什么时候想使用其中一个?

来自 IxJS 文档:

RxJS 非常适合基于事件的工作流程,其中数据可以以生产者的速度推送,但是,IxJS 非常适合 I/O 操作,您作为消费者可以在准备好时提取数据。

查看文档后,唯一的主要区别似乎是 IxJS 中的 IterablesRxJS 中的 Observables 的概念。

Iterables 和 Observables 都可以同步或异步执行,当与几乎相同的 from 创建函数配对时,IxJS 的 .forEach 与 RxJS 的 .subscribe 方法基本相同。唯一的其他区别是 IxJS 的 .forEach 方法是可选的,因为您可以改用命令式 for-of

似乎无缘无故有两个库,因为 RxJS 的 from creator 函数可以将 Iterables 转换为 Observables。

在我看来,它并不是真正的 IxJS 和 RxJS,而是 Iterables 和 Observables。它们有何不同?您何时会使用其中一种?

【问题讨论】:

    标签: rxjs ixjs


    【解决方案1】:

    作为对Oles Savluk 答案的补充,我发现 Matt Podwysocki 的解释特别有用 (https://gist.github.com/mattpodwysocki/1d0fe43961c6222571386568b8a5ef23):

    我们有四种类型的集合,每一种都有自己的用途。每个 有它自己的位置,没有一种解决方案可以统治所有这些。

    Pull: Iterable - purely synchronous data, either finite or infinite
    Push: Observable / Subject/Observer - eventual data such as DOM events, collections over time
    Pull/Push: AsyncIterable - I/O or other asynchronous data where the consumer needs to be in control
    Push/Pull: AsyncObservable - Network calls where creation/teardown may be asynchronous as well as projections may be asynchronous too.
    

    Matt 是 RxJS 和 IxJS 的贡献者。 Iterable 和 AsyncIterable 来自 IxJS,Observable 和 AsyncObservable 是在 RxJS 中开发的


    【讨论】:

      【解决方案2】:

      tl;博士

      RxJS 在值到达后立即处理它们。这是一个推送系统。

      IxJS 指定何时传入下一个值。这是一个拉动系统。

      说明

      IxJS 如果想要使用基于拉的模型可能会有所帮助,例如在处理背压时。

      如您在文档中所见:

      IxJS 统一了同步和异步基于拉的集合,就像 RxJS 统一了基于推送的集合一样。 RxJS 非常适合基于事件的工作流程,其中数据可以以生产者的速度推送,但是,IxJS 非常适合 I/O 操作,您作为消费者可以在准备好时提取数据。

      换句话说:

      • 如果您的生产者(通常是用户)处理数据的速度较慢(这在前端很常见),请使用 RxJS
      • 如果您的生产者(通常是系统)比您处理数据的速度快得多(更常见于后端),请使用 IxJS

      要理解这意味着什么,请考虑以下示例:

      您需要构建 ETL 管道并处理一个大文件(约 1TB)。

      如果你用 RxJS 编写,类似:

      readFileByLineObservable('path/to/file')
      .pipe(
        doSomeHeavyTransformation(),
      )
      .subscribe()
      

      那么readFileByLineObservable会尽快将1TB的整个文件“push”到RAM中。只有在这种情况发生后,你才会开始做doSomeHeavyTransformation。这个问题叫做backpressure

      相比之下,IxJS 只有在处理了前一行之后才会尝试“拉”每个换行符。这是这种情况下的最佳处理方法。

      不同之处在于 RxJS 的 .subscribe 如何设置侦听器,而 IxJS 的 .forEach 告诉它的迭代器何时给出下一个值(仅在它处理完第一个值之后。它与 RxJS 的相似但不同concatMapconcatAll 运算符。

      【讨论】:

      • 您能否举例说明 IxJS 对文件读取的处理方式有何不同?看起来 IxJS 更类似于 Node.js 流。
      • @Oles Savluk 可能取决于您阅读文件的方式。如果你使用 node readline 函数,你最终可能会得到一个不需要读取整个文件的 Observable。
      • @Oles Savluk 你可以看看这个例子gist.github.com/EnricoPicci/2ca0c40c649cbb08f2dfcf43e96ad085 - 我不确定它是否能回答你的问题,但这是我在读取文件时限制并发的方式。
      • 是的,你没看错,RxJS 推送数据,而 IxJS 拉数据。
      • 我写了一篇关于如何在 RxJS 中实现类似 IxJS 的功能的文章:itnext.io/lossless-backpressure-in-rxjs-b6de30a1b6d4。因为push 的级别低于pull,所以您可以使用两次推送来模拟拉动,其控制能力比IxJS 多。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 2017-03-22
      • 2022-06-26
      • 1970-01-01
      • 2017-05-30
      • 2018-06-11
      相关资源
      最近更新 更多