Angular为什么在HttpClient中使用Observable?

29
根据https://angular.io/tutorial/toh-pt6,通常情况下,可观察对象可以随着时间的推移返回多个值。HttpClient返回的可观察对象始终只会发出一个值,然后完成,不会再发出其他值。
这是确实的,一旦请求完成,Http请求/响应就不能产生更多的值。那么在发出请求时,HTTPClient为什么会返回一个Observable呢?它是因为我们可以在Observable上应用各种操作符(例如重试、去抖等)吗?还是有其他我忽略的特定原因?

为了保持API的一致性,例如不需要引入Promises。无论如何,Observables比Promises更灵活。 - Antoniossss
这是一个长期争论的话题。实际上,问题在于API的一致性以及您可以取消Observable但不能取消Promise。 - dee zg
3个回答

21
你能找到的最好的答案是Pascal Precth在2015年12月提出的一个专门问题的解释:“Observables对于http有意义吗?”(但请随意阅读,还有很多其他很好的答案!)
脑海中的想法: - 重试 - 取消 - 尽情使用Rxjs操作符 - 可以将它们组合为流 - 在整个应用程序中以响应式思考 - 一致性 - Observables本质上是冷的,如果您想稍后触发它们,无需像Promises一样将它们包装到工厂函数中

6

在 Angular 框架中,Observables 是标准的异步处理程序。

所谓标准,是指 observables 在 async pipe、路由守卫、路由解析器、组件事件发射器和许多其他地方都得到了支持。

Angular 团队为了兼容这些功能,已经付出了很多努力,但实际上在底层,这些 promises 都会被转换成 observables。

通过将 Http 请求变成 observables,Angular 团队使核心中的异步操作与其他所有地方保持一致。

虽然 observables 相对于 promises 仍有一些优势,但这主要是个人意见。

  • 您可以轻松地在服务中混合使用 Http 请求和 WebSockets,并将 API 作为 observables 公开。服务的使用者不会察觉到任何差异。
  • 您可以轻松地将数组的 Http 请求转换为一个可发出每个项目的 observable。这使得向不同的消费者分发数据变得更加容易。
  • 当 promise 链没有正确连接时,可能会导致 promise 失败。这些常见的错误通常可以通过使用 observables 避免。

哪里可以阅读更多关于“在底层,这些承诺只是被转换为可观察对象”的内容?谢谢。 - BorisD

4
为了保持 API 一致性,例如不需要引入 Promises。Observables 比 Promises 更灵活。此外,Observable 可以跟踪其订阅者。在 HttpClient 调用中,只要有订阅者出现就会进行调用。如果您不订阅 http 调用,则不会发出请求。
这就是为什么如果您多次订阅一个 Observable,将会发出多个请求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接