所以我已经读到,在一些即将推出的JavaScript MVC中,observables正在寻求超越承诺:
Angular 2.0
Falcor used by Netflix
观察和承诺之间有什么区别?
更新:道歉!删除了我的虚假陈述 .
简单地说:一个promise以异步方式解析为单个值,一个observable异步解析(或发出)多个值(随着时间的推移) .
具体例子:
Promise:来自Ajax调用的响应
Observable:单击事件
更多信息可以在这里找到:http://reactivex.io/intro.html
我读过,观察者正在寻求超越承诺
不太可能 . 对于某些问题,Observable可能是更好的解决方案,但这并不能使承诺过时(如果这就是你的意思) .
承诺是未来 Value 的代表 . 可观察量是可能无限量的值的表示 .
Promise会在创建后立即触发获取该值 . Observable只会在您订阅它们时开始生成值 . (除非它是一个热门观察,但这超出了这个问题的范围)
Promise旨在表示AJAX调用 . Observable旨在表示任何事物:事件,来自数据库的数据,来自ajax调用的数据,(可能是无限的)序列等 .
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的部分 .
如Angular 2 guid所述
当您想要获取单个数据块时,转换为Promise通常是一个不错的选择 . 所以当你收到数据时,你已经完成了 .
但在某些情况下,请求并不总是只进行一次 . 您可以在服务器响应第一个请求之前启动一个请求,取消它并发出不同的请求 .
例如,在搜索组件中当用户在搜索框中键入名称时,您将通过该搜索查询重复发出HTTP请求 .
使用Promises很难实现请求 - 取消 - 新请求序列,但使用Observables很容易 .
因此,如果您的组件只使用一个请求获取数据,那么它是一个不错的选择 Promise 但是如果它有一个请求 - 取消 - 新请求链你应该使用 observable
Promise
observable
可观察量通常与承诺相比较 . 以下是一些主要差异:
可观察者是陈述性的;计算直到订阅才开始 . Promise在创建时立即执行 . 这使得observable可用于定义可在需要结果时运行的配方 .
Observable提供了许多值 . 承诺提供一个 . 这使得observable可用于随时间获取多个值 .
Observable区分链接和订阅 . Promise只有.then()子句 . 这使得observable对于创建系统其他部分使用的复杂转换配方非常有用,而不会导致工作被执行 .
可观察者subscribe()负责处理错误 . 承诺推动儿童承诺错误 . 这使得observable对集中和可预测的错误处理很有用 .
官方网站上有角度的最佳解释:
https://angular.io/guide/comparing-observables
5 回答
简单地说:一个promise以异步方式解析为单个值,一个observable异步解析(或发出)多个值(随着时间的推移) .
具体例子:
Promise:来自Ajax调用的响应
Observable:单击事件
更多信息可以在这里找到:http://reactivex.io/intro.html
不太可能 . 对于某些问题,Observable可能是更好的解决方案,但这并不能使承诺过时(如果这就是你的意思) .
承诺是未来 Value 的代表 . 可观察量是可能无限量的值的表示 .
Promise会在创建后立即触发获取该值 . Observable只会在您订阅它们时开始生成值 . (除非它是一个热门观察,但这超出了这个问题的范围)
Promise旨在表示AJAX调用 . Observable旨在表示任何事物:事件,来自数据库的数据,来自ajax调用的数据,(可能是无限的)序列等 .
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的部分 .
如Angular 2 guid所述
当您想要获取单个数据块时,转换为Promise通常是一个不错的选择 . 所以当你收到数据时,你已经完成了 .
但在某些情况下,请求并不总是只进行一次 . 您可以在服务器响应第一个请求之前启动一个请求,取消它并发出不同的请求 .
例如,在搜索组件中当用户在搜索框中键入名称时,您将通过该搜索查询重复发出HTTP请求 .
因此,如果您的组件只使用一个请求获取数据,那么它是一个不错的选择
Promise
但是如果它有一个请求 - 取消 - 新请求链你应该使用observable
可观察量通常与承诺相比较 . 以下是一些主要差异:
可观察者是陈述性的;计算直到订阅才开始 . Promise在创建时立即执行 . 这使得observable可用于定义可在需要结果时运行的配方 .
Observable提供了许多值 . 承诺提供一个 . 这使得observable可用于随时间获取多个值 .
Observable区分链接和订阅 . Promise只有.then()子句 . 这使得observable对于创建系统其他部分使用的复杂转换配方非常有用,而不会导致工作被执行 .
可观察者subscribe()负责处理错误 . 承诺推动儿童承诺错误 . 这使得observable对集中和可预测的错误处理很有用 .
官方网站上有角度的最佳解释:
https://angular.io/guide/comparing-observables