RxJS和IxJS之间的区别?

Saw*_*oes 7 rxjs ixjs

RxJS和IxJS有什么区别,什么时候我要在另一个上使用?

从IxJS文档中:

RxJS非常适合基于事件的工作流,在这些工作流中,数据可以按生产者的速度推送,但是IxJS非常适合I / O操作,在此情况下,作为消费者的用户可以在准备就绪时提取数据。

通过文档会后,唯一的主要区别似乎是概念Iterables在IxJS观测量的RxJS

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

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

在我看来,它不是真正的IxJS和RxJS,而是Iterables和Observables。它们有何不同?何时使用它们?

Ole*_*luk 10

tl; dr

RxJS会在值到达后立即对其进行处理。这是一个推送系统。

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

说明

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

如您在文档中所见:

IxJS统一了基于同步和异步基于pull的集合,就像RxJS统一了基于push的集合的世界一样。RxJS非常适合基于事件的工作流,在这些工作流中,数据可以按生产者的速度推送,但是IxJS非常适合I / O操作,在此情况下,作为消费者的用户可以在准备就绪时提取数据。

换一种说法:

  • 使用RxJS,如果你的制作人(通常是用户)是比较慢的数据处理(这是很常见的前端)。
  • 使用IxJS,如果你的制作人(通常System)是速度远远超过你可以处理数据(后端多见)。

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

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

如果使用RxJS编写,则类似:

readFileByLineObservable('path/to/file')
.pipe(
  doSomeHeavyTransformation(),
)
.subscribe()
Run Code Online (Sandbox Code Playgroud)

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

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

区别在于RxJS .subscribe设置侦听器的方式,而IxJS .forEach告诉其迭代器何时提供下一个值(仅在处理完第一个值之后。它类似于RxJS的concatMapconcatAll运算符,但不相同)。

  • 我写了一篇关于如何在 RxJS 中实现类似 IxJS 的功能的文章:https://itnext.io/lossless-backpressure-in-rxjs-b6de30a1b6d4。因为`push` 比`pull` 级别低,所以你可以使用两次push 来模拟一个pull,比IxJS 有更多的控制。 (3认同)

Bog*_*Biv 5

作为对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.
Run Code Online (Sandbox Code Playgroud)

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