我'm long familear with JavaScript'的承诺 . 我知道今天Promises是JavaScript语言的一部分 - 从ES6开始,但很久以前他们就已经(现在仍然)有一些不同的库来实现它们 .
我最近开始研究几个Angular项目,并且我被介绍了Observables的概念(RxJs) .
在一些invanesgations之后,我理解了Observables和Promises之间的基本区别:
Observables
-
将0传递给N个事件 . 每个事件都可以调用回调 .
-
一个可观察的是 Cancelable
-
它们有很多不同的方法(由RxJs团队实现),可以帮助我读取和解析数据,如:
map
,_ 87798,retry
等 .
只有当某人订阅了它们时才会触发 -
Observables块(否则不会发生任何事情)
承诺
-
处理 single 事件,该事件将调用成功回调或失败回调 .
-
ES6承诺不可取消(至少目前为止) . 然而,不同的libreries已经实现了可取消的承诺,例如BlueBird .
-
无论是否有人订阅(使用
then
或catch
),都会触发Promises块 .
我的问题不是它们之间有什么区别,但我们是否真的需要Observables,还是只是语法糖?由于Promises的使用是同步(按顺序设置)异步流,通过告诉一个代码块仅在其他代码块完成它的流程时运行 .
-
我们真的关心处理乘法事件,因为几乎总是我们想要对成功或某些流程的失败(如服务器请求)做出反应 .
-
用于处理Observable的RxJs方法(辅助函数)很酷,但并不真正相关,因为您可以使用第三方库来实现该行为(例如,而不是使用RxJs
debounce
我可以使用带有Promise的Lodash_.debounce
) . 当然,每个第三方库都带有额外的复杂性 - 但RxJ也是如此 . -
Observables只在订阅后被触发 - 这不是那么重要 - 如果没有人正在监听(订阅)它们,我们为什么要拥有一个Observable .
P.S
请不要阅读这个问题,并认为我有一些个人代理Observables,我只是想了解他们最闪亮的地方?在哪些情况下,他们优于承诺,如果有的话?
1 回答
我确实相信我们不应该问 do we need observables? 我们应该问 when do we need observables? 有些事情你错过了差异:
Observable并不总是异步的,某些运算符如
Observable.just
是完全同步的 .有热和冷的可观察量,这意味着一些可观察物只在你订阅它们后才开始发射,
HttpClient::get
就是其中之一 . 虽然承诺急切地评估 .RXJS Observables旨在提供一种简单的方法来进行功能性反应式编程,而promise只是一种进行异步编程的方法 .
基于此我可以说 Observables are not just syntactical sugar for promises ,而是一个完全不同的结构 .