JavaScript中的observable和promise之间有什么区别?

chr*_*lee 36 javascript promise es6-promise

所以我读过,在一些即将推出的JavaScript MVC中,observable正在寻求超越承诺:

观察与承诺之间有什么区别?

更新:道歉!删除了我的虚假陈述.

Fel*_*ing 35

观察与承诺之间有什么区别?

简单地说:一个promise以异步方式解析为单个值,一个observable异步解析(或发出)多个值(随着时间的推移).

具体例子:

  • 承诺:来自Ajax调用的响应
  • 可观察:点击事件

可以在此处找到更多信息:http://reactivex.io/intro.html

我读过,观察者正在寻求超越承诺

不太可能.对于某些问题,Observable可能是更好的解决方案,但这并不能使承诺过时(如果这就是你的意思).

  • 哇,这根本不是什么大不同 - 在错误处理,调度和模型方面存在巨大差异.promise是_single value_,observable就像_function_,可以调用它来产生多个值.承诺总是被缓存和多播 - 一个可观察的是单播.如果ajax调用的observable有两个订阅者 - 每个将(除非使用组合子)创建一个单独的HTTP调用. (5认同)
  • @BenjaminGruenbaum我认为公平地说,这个答案得到了主要的区别,你的评论表明了细微差别. (4认同)

Moe*_*eri 35

承诺是未来价值的代表.可观察量是可能无限量的值的表示.

Promise会在创建后立即触发获取该值.Observable只会在您订阅它们时开始生成值.(除非它是一个热门的观察者,但这超出了这个问题的范围)

Promise旨在表示AJAX调用.Observable旨在表示任何事物:事件,来自数据库的数据,来自ajax调用的数据,(可能是无限的)序列等.


小智 24

Promise提供了一种非常简单的回调机制,其中Rx提供了对异步编程的强大抽象.Observable表示数据流,然后我们可以应用运算符来定义如何处理传入数据.

如果您只需要发出HTTP请求然后更新UI组件,那么使用Promise就足够了.

但是,大多数应用程序往往需要比这更复杂的需求(即使它在第一时间并不明显).以我们的HTTP请求为例,让我们看看如何将它建模为Observable并使用一些Rx运算符可以帮助我们:

- 如果HTTP请求是由用户操作触发的,我们可能需要警惕触发多个HTTP请求(假设用户在搜索框中键入内容).我们不想火每次击键的要求,所以我们可能要节流我们的搜索,所以我们只有在用户停止输入300毫秒火的请求.此外,如果用户键入一个单词,等待300毫秒,并添加另一个字符,我们将触发后续的HTTP请求.有了Promise,我们可能会遇到竞争条件,因为我们无法控制我们收到回复的顺序,也无法取消旧的请求.Rx通过允许我们在流之间切换来解决这个问题,在我们不再关心的旧请求订阅上调用Dispose.我们还可以过滤掉任何无效的搜索输入,例如搜索词的长度小于3个字符.

- 支持处理超时/错误处理.假设我们的HTTP请求失败,Rx允许我们轻松地重试发出请求.

- 假设我们的应用程序的几个部分需要进行相同的HTTP调用,我们可能不希望实际调用多次.我们可以将我们的observable暴露给多个消费者并使用Replay来确保调用一次,并为后续订阅者缓存结果.我们甚至可以为Replay提供TimeSpan,为我们提供过期的缓存行为.

- 通过使用调度程序对线程进行强大的抽象,这允许我们控制并发性.更好的是,我们可以在单元测试中使用测试调度程序来控制时间,允许我们模拟超时,竞争条件等.

这些是一些快速示例,用于演示可能的内容.Rx框架中有许多运算符可以满足所有类型的场景,Rx的可组合性意味着您可以轻松地组合运算符来定义所需的行为.创建自己的可重用运算符也很容易(例如RetryAfterDelay).

总而言之,Rx可以完成除Promise所能做的所有事情,而且远远更多.我怀疑在接下来的几年里会继续转向Rx而不是Promises.

为了进一步阅读,我建议您查看Angular 2指南中有关Observables的部分.


Par*_*kht 7

正如Angular 2指南中所述

当您想要获取单个数据块时,转换为Promise通常是一个不错的选择.所以当你收到数据时,你已经完成了.

但在某些情况下,请求并不总是只进行一次.您可以在服务器响应第一个请求之前启动一个请求,取消它并发出不同的请求.

例如,在搜索组件中当用户在搜索框中键入名称时,您将通过该搜索查询重复发出HTTP请求.

使用Promises很难实现请求 - 取消 - 新请求序列,但使用Observable很容易.

因此,如果您的组件只使用一个请求获取数据,那么它是一个很好的选择,Promise但如果它有一个请求 - 取消 - 新请求链,您应该使用observable