正如您已经说过的,Rx 将帮助您处理异步事件。当然,在reduce 的情况下,您也可以使用Array 方法。但是您必须 (a) 从一开始就进行整个计算,当新值到达时,或者 (b) 存储累积值并对新值进行一次归约。
所以,如果你使用 RxJS,它基本上会为你做 (b)。意思是,它将累积值存储在 .reduce 方法创建的 observable 中。每当一个新值出现(来自生产者)时,它都会再次应用这些方法。
对于count、max和min:它们实际上是过滤方法。当然,您可以使用临时值和一些 Array 方法来实现这一点。但是,如果您自己已经尝试过,那么实现和处理异步事件确实很麻烦。您必须存储临时值,...
RxJS 会为你抽象出所有的异步。您提到的运算符只是一个用于转换/过滤/...传入事物的大工具包。我建议阅读this article by Ben Lesh。
RxJS 的最大优势在于,尤其是在构建 UI 时,您永远不知道“异步数组”(=events)何时完成。所以你必须做(a)或(b),这真的很烦人。 RxJS 为您抽象了这种行为,因此您可以处理实际问题。
关于完成
我错过了你关于需要完成的序列的一点:
并非所有运营商都如此。如果您订阅 Observable + 运算符链,您将始终获得由 observable 生成的 current (=last) 值。如果通过管道推送新值,则将更新当前值并通知所有订阅者。
示例
这是一个非常简单的例子,在我看来,它说明了为什么 RxJS 比“旧的做事方式”有了如此巨大的改进:http://jsbin.com/suqila/1/edit?js,output
在非 RxJS 中,您始终必须存储状态并在方法中引入副作用。使用 RxJS,您可以消除使代码更容易推理的副作用。
同步与异步
在我上面提到的文章中,Ben Lesh 说:
Observables通常是异步的。
他的意思是,您通常使用可观察对象来处理异步问题,自动完成是一个非常流行的例子。很少你也可以使用同步的 Observables。例如Observable.of([1,2,3]) 是同步的。
起初这可能会令人困惑,但实际上这并不重要。 Observables 是惰性/基于推送的。意思是,他们什么都不做,直到他们从他们的生产者和/或订阅他们的人那里得到一个新的价值(取决于他们是热的还是冷的)。但是这个过程是同步的还是异步的,取决于生产者。
运营商也是如此。它们是接受源 observable 并返回一个新的 observable 的函数,当您订阅它时,它将订阅该源 observable。差不多就是这样。当一个新值被推入操作符链时,它们就会执行。