RxJS和IxJS之间的区别?
RxJS和IxJS之间有什么区别,什么时候我想使用一个而不是另一个 从IxJS文档: RxJS非常适用于基于事件的工作流,其中数据可以以生产者的速度推送,然而,IxJS非常适用于I/O操作,在I/O操作中,作为消费者,您可以在准备就绪时拉取数据 看完这些文档后,唯一的主要区别似乎是IxJS中的可观察性概念和RxJS中的可观察性概念 Iterables和Observable都是同步或异步执行的,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
.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可能取决于您读取文件的方式。如果您使用Nodereadline
函数,您可能会得到一个不需要读取整个文件的可观察对象。@Oles Savluk您可能看起来有点奇怪t这个例子-我不确定它是否回答了你的问题,但这是我在读取文件时限制并发性的方式。是的,你说得对,RxJS推送数据,而IxJS拉取数据。我写了一篇文章,介绍如何在RxJS中实现类似IxJS的功能:。因为push
的级别低于pull
,所以可以对simu进行两次推送比IxJS具有更多控制的延迟拉取。