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

所以我读过,观察者正在寻求在即将到来的JavaScript MVC中的使用方面超过承诺:

  • Angular 2.0
  • Netflix使用Falcor
  • 可观察到的和承诺有什么区别?

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


    可观察到的和承诺有什么区别?

    简而言之:承诺异步解析为单个值,observable异步解析(或发射)多个值(随时间推移)。

    具体例子:

  • Promise:来自Ajax调用的响应
  • 可观察:点击事件
  • 更多信息可以在这里找到:http://reactivex.io/intro.html

    我已经读过,可观察到的要超过承诺

    不太可能。 观察对象可能是某些问题的更好解决方案,但这不会使承诺过时(如果这就是你的意思)。


    承诺是1个未来价值的表示。 可观测量是可能无限量值的表示。

    承诺会在创建时立即触发该价值。 观察对象只有在订阅它们时才会开始生成值。 (除非它是一个热门的可观察的事物,但这超出了这个问题的范围)

    Promise旨在表示AJAX调用。 观察对象被设计为表示任何事物:事件,来自数据库的数据,来自Ajax调用的数据(可能是无限的)序列等。


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

    如果你只需要做一个HTTP请求然后更新一个UI组件,那么使用Promise就足够了。

    然而,大多数应用程序的需求往往比这更复杂(即使它最初并不明显)。 以我们的HTTP请求为例,我们来看看如何将它建模为Observable并使用一些Rx操作符来帮助我们:

    - 如果HTTP请求是由用户操作触发的,我们可能希望警惕释放多个HTTP请求(想象用户键入搜索框)。 我们不想火每个按键的请求,因此我们可能会扼杀我们搜索,所以我们只有在用户停止输入300毫秒火的请求。 此外,如果用户键入一个单词,等待300ms,并添加另一个字符,我们将触发后续的HTTP请求。 有了承诺,我们可能会遇到竞争状况,因为我们无法控制收到响应的顺序,并且我们无法取消旧的请求。 Rx通过允许我们切换流,在我们不再关心的旧请求订阅上调用Dispose ,解决了这个问题。 我们还可以过滤掉任何无效的搜索输入,例如搜索词的长度小于3个字符。

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

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

    - 通过调度程序的线程强大的抽象,这使我们能够控制并发。 更好的是,我们可以在我们的单元测试中使用测试计划来控制时间,从而允许我们模拟超时,竞争条件等。

    这些是一些快速的例子来证明什么是可能的。 Rx框架中有更多的运营商可以满足所有类型的场景,而Rx的组合性意味着您可以轻松地将运营商组合起来以定义您所需的行为。 创建自己的可重用操作符也很容易(例如RetryAfterDelay)。

    总之,Rx可以做任何事情都比Promises可以做的更多。 我怀疑在接下来的几年里会继续向Rx转变,而不是Promises。

    为了进一步阅读,我建议看一看Angular 2指南中的Observable部分。

    链接地址: http://www.djcxy.com/p/55469.html

    上一篇: What are the differences between observables and promises in JavaScript?

    下一篇: @Directive v/s @Component in Angular