首页 文章

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

提问于
浏览
28

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

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

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

5 回答

  • 6

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

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

    具体例子:

    • Promise:来自Ajax调用的响应

    • Observable:单击事件

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

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

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

  • 29

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

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

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

  • 23

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

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

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

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

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

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

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

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

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

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

  • 1

    Angular 2 guid所述

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

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

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

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

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

  • 32

    可观察量通常与承诺相比较 . 以下是一些主要差异:

    可观察者是陈述性的;计算直到订阅才开始 . Promise在创建时立即执行 . 这使得observable可用于定义可在需要结果时运行的配方 .

    Observable提供了许多值 . 承诺提供一个 . 这使得observable可用于随时间获取多个值 .

    Observable区分链接和订阅 . Promise只有.then()子句 . 这使得observable对于创建系统其他部分使用的复杂转换配方非常有用,而不会导致工作被执行 .

    可观察者subscribe()负责处理错误 . 承诺推动儿童承诺错误 . 这使得observable对集中和可预测的错误处理很有用 .

    官方网站上有角度的最佳解释:

    https://angular.io/guide/comparing-observables

相关问题