【问题标题】:synchronous vs asynchronous sequences in RxJSRxJS 中的同步与异步序列
【发布时间】:2016-08-19 07:03:04
【问题描述】:

我想我有一个非常基本的问题,关于同步和异步运算符和序列之间的区别。

我们在程序中处理的所有事情都可以表示为一个序列。这意味着我可以同时拥有:

  • 作为序列的数字数组。这是我传统上会同步处理的事情,例如使用reduce 函数计算总和或平均值。但我需要知道所有元素才能计算它。
  • 点击事件数组。它们是异步来的(将来我不知道有多少,什么时候来)。

使用常见的Observable 数据类型,我可以对不同的元素执行许多操作,例如merge、zip 等。

RxJS 的整个想法是以异步方式处理序列,所以 我的问题是 - 所有average、count、max、min 的意义何在,reduce等运算符,需要完成哪些序列?如果我不能将任何元素添加到序列中(将元素异步添加到数组 - 为什么不呢?)以便它重新计算 - 为什么我应该使用 RxJS 而不是 Array.prototype.reduce?

换句话说 - 最初我认为序列应该始终能够在其上执行运算符(无论运算符是什么)即使序列未完成。

【问题讨论】:

    标签: javascript asynchronous rxjs


    【解决方案1】:

    正如您已经说过的,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。差不多就是这样。当一个新值被推入操作符链时,它们就会执行。

    【讨论】:

    • 感谢您的解释,但它基本上不能回答我的问题。我知道 RxJS 强制使用纯函数(= 没有副作用),但我的问题不同。在 JS 中,我们必须区分什么是同步和什么是异步。您永远不要将同步工具用于异步任务,反之亦然。我问的问题是 - 我怎么知道哪个 RxJS 元素应该是同步的,哪个应该是异步的。
    • 对不起,我专注于您问题中的粗体部分,b/c 我以为您误解了“流”的概念及其完成。我添加了一个关于 (a)sync 的部分。希望这可以帮助。此外,RxJS 不会强迫您使用纯函数。 “RxJS 元素”是什么意思?
    猜你喜欢
    • 2016-07-22
    • 1970-01-01
    • 2014-01-05
    • 2015-02-23
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多