JavaScript - 我们应该使用Observables吗?还是承诺就足够了?

时间:2018-05-24 14:46:01

标签: javascript angular rxjs observable es6-promise

我长期以来都喜欢JavaScript的Promises。我知道今天Promises是JavaScript语言的一部分 - 从ES6开始,但很久以前他们就已经(现在仍然)有一些不同的库来实现它们。

我最近开始参与一些Angular项目,并且我被介绍了 Observables 的概念(RxJs)。 在一些调查之后,我理解了Observables和Promises之间的基本区别:

观测量

  • 将0传递给N个事件。每个事件都可以调用回调。
  • 可观察的是可取消
  • 它们有很多不同的方法(由RxJs团队实施),可以帮助我读取和解析数据,如:mapreduceretry等。
  • 只有当有人订阅了它们时才会触发Observables块(否则什么都不会发生)

承诺

  • 处理单个事件,该事件将调用成功回调或失败回调。
  • ES6承诺不可取消(至少目前为止)。然而,不同的libreries已经实现了可取消的承诺,例如BlueBird
  • 无论是否有人订阅(使用thencatch),都会触发Promise阻止。

我的问题不是它们之间有什么区别,但我们是否真的需要Observables,还是只是语法糖? 由于Promises的使用是同步(按顺序设置)异步流,通过告诉一个代码块仅在代码块完成它的流程时运行。

  1. 我们是否真的关心处理乘法事件,因为我们几乎总是希望对成功或某些流程的失败做出反应(如服务器请求)。
  2. 用于处理Observable的RxJs方法(辅助函数)很酷,但并不真正相关,因为您可以使用第三方库来实现该行为(例如,而不是使用RxJ debounce我可以使用Lodash {{1与承诺)。当然,每个第三方库都带有额外的复杂性 - 但RxJs也是如此。
  3. Observable只在订阅后被解雇 - 这不是那么重要 - 如果没有人正在监听(订阅)他们,我们为什么要有一个Observable。
  4. P.S
    请不要阅读这个问题,并认为我有一些个人代理Observables,我只是想了解他们最闪亮的地方?在哪些情况下,如果有的话,它们优于承诺?

1 个答案:

答案 0 :(得分:2)

我确实认为不是要求我们是否需要观察?我们应该问什么时候需要观察?有些事情你错过了差异:

  1. Observable并不总是异步的,像Observable.just这样的运算符是完全同步的。
  2. 有热和冷的可观察对象,这意味着一些可观察者只有在你订阅它们之后才开始发射,HttpClient::get就是其中之一。虽然承诺急切地评估。
  3. RXJS Observables旨在提供一种简单的方法来进行功能性反应式编程,而承诺只是进行异步编程的一种方式。

    基于此我可以说 Observables不仅仅是承诺的语法糖,而是一种完全不同的结构。