RxJS和IxJS之间的区别?

RxJS和IxJS之间的区别?,rxjs,ixjs,Rxjs,Ixjs,RxJS和IxJS之间有什么区别,什么时候我想使用一个而不是另一个 从IxJS文档: RxJS非常适用于基于事件的工作流,其中数据可以以生产者的速度推送,然而,IxJS非常适用于I/O操作,在I/O操作中,作为消费者,您可以在准备就绪时拉取数据 看完这些文档后,唯一的主要区别似乎是IxJS中的可观察性概念和RxJS中的可观察性概念 Iterables和Observable都是同步或异步执行的,IxJS中的.forEach与RxJS的.subscribe方法基本相同,如果与中几乎相同的creato

RxJS和IxJS之间有什么区别,什么时候我想使用一个而不是另一个

从IxJS文档:

RxJS非常适用于基于事件的工作流,其中数据可以以生产者的速度推送,然而,IxJS非常适用于I/O操作,在I/O操作中,作为消费者,您可以在准备就绪时拉取数据

看完这些文档后,唯一的主要区别似乎是IxJS中的可观察性概念和RxJS中的可观察性概念

Iterables和Observable都是同步或异步执行的,IxJS中的
.forEach
与RxJS的
.subscribe
方法基本相同,如果与中几乎相同的
creator函数配对。唯一的其他区别是IxJS的
。forEach
方法是可选的,因为您可以使用命令式
代替of

似乎无缘无故有两个库,因为RxJS的
from
creator函数可以将可测性转换为可观测性

从我的角度来看,它不是真正的IxJS和RxJS,而是不可测性和可观测性。它们有何不同?您什么时候会使用其中一个而不是另一个?

tl;博士 RxJS在值到达时立即处理它们。这是一个推送系统

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

解释
IxJS
如果希望使用基于拉力的模型,例如在处理背压时,可能会有所帮助

正如您在文档中看到的:

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

换言之:

  • 如果您的制作人(通常是用户)处理数据的速度比您的制作人(通常是前端用户)慢,请使用
    RxJS
  • 如果您的制作人(通常是系统)处理数据的速度远远快于您的处理速度(在后端更常见),请使用
    IxJS
为了理解这意味着什么,请考虑下面的例子:

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

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

readFileByLineObservable('path/to/file')
.pipe(
  doSomeHeavyTransformation(),
)
.subscribe()
然后,
readFileByLineObservable
将尝试尽快将1TB的整个文件“推”到RAM中。只有在这种情况发生后,您才能开始执行
doSomeHeavyTransformation
。这个问题叫做

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

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

作为对答案的补充,我发现Matt Podwysocki的解释特别有用():

我们有四种类型的收藏品,每种都有自己的目的 它有自己的位置,没有一个解决方案可以统领所有这些问题

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



您能举例说明IxJS在读取文件时有何不同吗?似乎IxJS更类似于Node.js streams。@Oles Savluk可能取决于您读取文件的方式。如果您使用Node
readline
函数,您可能会得到一个不需要读取整个文件的可观察对象。@Oles Savluk您可能看起来有点奇怪t这个例子-我不确定它是否回答了你的问题,但这是我在读取文件时限制并发性的方式。是的,你说得对,RxJS推送数据,而IxJS拉取数据。我写了一篇文章,介绍如何在RxJS中实现类似IxJS的功能:。因为
push
的级别低于
pull
,所以可以对simu进行两次推送比IxJS具有更多控制的延迟拉取。