我想关于同步和异步运算符和序列之间的区别,我有一个很基本的问题。
我们在程序中处理的所有内容都可以表示为一个序列。这意味着我可以同时拥有:
reduce
函数来计算总和或平均值。但是我需要知道所有元素才能进行计算。使用通用Observable
数据类型,我可以对merge
,zip
等不同元素执行许多操作。
RxJS的整体思想是异步处理序列,所以我的问题是-所有average,count,max,min,reduce等运算符的意义是什么,需要完成序列吗?如果我不能在序列中添加任何元素(将元素异步添加到数组-为什么不添加?)以便重新计算-为什么我应该在Array.prototype.reduce上使用RxJS?
换句话说-最初,我认为序列应该始终能够在其上执行运算符(运算符是什么),即使序列未完成也是如此。
正如您已经说过的,Rx将帮助您处理异步事件。当然,reduce
您也可以使用该Array
方法。但是,您将必须(a)从新开始时进行新的计算,或者在新值到达时进行(b)存储累加值并对新值进行一次减少。
因此,如果您使用的是RxJS,它将基本上为您执行(b)。意思是,它将累积值存储在该.reduce
方法创建的可观察值中。每当有新值出现(来自生产者),它将再次应用该方法。
在情况下count
,max
和min
:他们实际上是过滤器的方法。当然,您可以使用临时值和某些Array
方法来实现此目的。但是,如果您已经尝试过此操作,则实现和处理异步事件确实很麻烦。您必须存储临时值,...
RxJS将为您抽象所有异步。您提到的运算符只是用于转换/过滤/ ...传入内容的大型工具包。我建议阅读Ben Lesh的这篇文章。
RxJS的最大优势在于,尤其是在构建UI时,您永远都不知道“异步数组”(=事件)何时完成。因此,您必须执行(a)或(b),这确实很烦人。RxJS为您抽象了此行为,因此您可以处理实际的问题。
我错过了您提出的关于序列需要完成的观点:
对于所有运营商而言并非如此。如果您订阅了Observable +运算符链,您将始终获得Observable产生的当前(=最后)值。如果通过管道推送新值,则将更新当前值,并通知所有订户。
这是一个非常简单的示例,在我看来,这表明为什么RxJS与“旧的处理方式”相比有如此大的改进:http ://jsbin.com/suqila/1/edit?js,output
在非RxJS中,您始终必须存储状态并在您的方法中引入副作用。使用RxJS,您可以消除副作用,使代码更容易推理。
在上面我提到的文章中,Ben Lesh说:
可观察对象通常是异步的。
他的意思是,您通常使用可观察变量来解决异步问题,自动完成是一个非常受欢迎的示例。很少您也可以使用同步Observable。Observable.of([1,2,3])
例如是同步的。
起初这可能会造成混淆,但实际上并不重要。可观察对象是基于懒惰/推送的。意思是,他们什么也不做,直到他们从生产者那里获得新的价值和/或某人订阅了它们(取决于它们是冷还是热)。但这取决于生产者,该过程是同步的还是异步的。
对于运营商来说也是如此。它们是接受源可观察的函数,并返回一个新的可观察对象,当您订阅源时,该新观察对象将订阅该源。就是这样。当通过操作员链推送新值时,它们将执行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句