RxJS和IxJS之间的区别?

时间:2018-10-28 09:42:21

标签: rxjs ixjs

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

从IxJS文档中:

  

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

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

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

似乎有两个库无缘无故,因为RxJS的from创建者函数可以将Iterable转换为Observable。

在我看来,它不是真正的IxJS和RxJS,而是Iterables和Observables。它们有什么不同?什么时候可以使用另一个?

2 个答案:

答案 0 :(得分:7)

tl; dr

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

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

说明

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

您可以在文档中看到

  

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

换句话说:

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

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

  

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

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

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

然后readFileByLineObservable将尝试将整个1TB文件“尽快”推入RAM。只有在这种情况发生之后,您才开始执行doSomeHeavyTransformation。这个问题称为backpressure

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

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

答案 1 :(得分:0)

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