15

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

来自 IxJS 文档:

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

浏览完文档后,唯一的主要区别似乎是 IxJS 中的Iterables 和 RxJS 中Observables 的概念

Iterables 和 Observables 都可以同步或异步执行,当与几乎相同的creator 函数配对时,.forEachfrom IxJS 与 RxJS 的方法基本相同。唯一的其他区别是 IxJS 的方法是可选的,因为您可以使用命令式代替。.subscribefrom.forEachfor-of

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

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

4

2 回答 2

20

tl;博士

RxJS 一到就处理值。这是一个推送系统。

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

解释

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

正如您在文档中看到的:

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

换句话说:

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

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

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

如果你用 RxJS 编写它,类似于:

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

然后readFileByLineObservable将尝试尽快将 1TB 的整个文件“推送”到 RAM 中。只有在这种情况发生后,您才会开始做doSomeHeavyTransformation. 这个问题称为背压

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

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

于 2018-10-28T10:11:51.500 回答
2

作为对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 中开发的


于 2020-09-17T10:21:39.277 回答