为什么 Angular 对 HttpClient 使用 Observable?
Why Angular uses Observable for HttpClient?
根据https://angular.io/tutorial/toh-pt6
In general, an observable can return multiple values over time. An
observable from HttpClient always emits a single value and then
completes, never to emit again.
的确如此,一旦请求完成,Http request/response 就无法再生成任何值。那么 HTTPClient returns 在发出请求时成为 Observable 的主要原因是什么?仅仅是因为我们可以在 Observable 上应用大量运算符(重试、去抖等)吗?还是有任何其他具体原因我失踪了?
保持API一致性。例如,无需引入 Promises。无论如何,Observables 比 Promises 更灵活。此外,observable 可以跟踪其订阅者。在 HttpClient 的情况下,一旦订阅者出现就会进行调用。如果您不订阅 http 调用,则不会发出请求。
这就是为什么如果您多次订阅 1 个 observable,就会发出多个请求。
您会找到 Pascal Precth 的最佳答案,他在 2015 年 12 月提出的一个专门问题上解释了这一点:"Do Observables make sense for http?"(但请随意阅读,还有很多其他答案也真的很棒!)
在我的头顶上:
- 重试
- 取消
- 享受所有 Rxjs 运算符
- 可以将它们合并为流
- 在你的整个应用程序中反应式思考
- 一致性
- Observables 本质上是冷的,如果你想稍后触发它,不需要像 Promises 一样将它们包装到工厂函数中
Observable 是 Angular 框架中的标准异步处理程序。
按照标准,我的意思是异步管道、路由守卫、路由解析器、组件事件发射器和许多其他地方都支持可观察对象。
Angular 团队付出了很多努力来支持 promises 作为许多这些功能的后备,但在幕后,这些 promises 无论如何都只是转换为可观察的。
通过使 Http 请求可观察,Angular 团队正在使核心中的异步操作与其他地方的一切保持一致。
与 promises 相比,observables 仍然有一些优势,但这主要是固执己见的(正如我自己的观点)。
- 您可以轻松地在服务中混合使用 Http 请求和 WebSocket,并将 API 公开为可观察对象。服务的消费者不会知道其中的区别。
- 您可以轻松地将对数组的 Http 请求转换为单独发出每个项目的可观察对象。这使得将数据分派给不同的消费者变得容易得多。
- 如果未正确链接,Promise 可能会中断。 Observables 通常可以避免这些常见错误。
根据https://angular.io/tutorial/toh-pt6
In general, an observable can return multiple values over time. An observable from HttpClient always emits a single value and then completes, never to emit again.
的确如此,一旦请求完成,Http request/response 就无法再生成任何值。那么 HTTPClient returns 在发出请求时成为 Observable 的主要原因是什么?仅仅是因为我们可以在 Observable 上应用大量运算符(重试、去抖等)吗?还是有任何其他具体原因我失踪了?
保持API一致性。例如,无需引入 Promises。无论如何,Observables 比 Promises 更灵活。此外,observable 可以跟踪其订阅者。在 HttpClient 的情况下,一旦订阅者出现就会进行调用。如果您不订阅 http 调用,则不会发出请求。
这就是为什么如果您多次订阅 1 个 observable,就会发出多个请求。
您会找到 Pascal Precth 的最佳答案,他在 2015 年 12 月提出的一个专门问题上解释了这一点:"Do Observables make sense for http?"(但请随意阅读,还有很多其他答案也真的很棒!)
在我的头顶上:
- 重试
- 取消
- 享受所有 Rxjs 运算符
- 可以将它们合并为流
- 在你的整个应用程序中反应式思考
- 一致性
- Observables 本质上是冷的,如果你想稍后触发它,不需要像 Promises 一样将它们包装到工厂函数中
Observable 是 Angular 框架中的标准异步处理程序。
按照标准,我的意思是异步管道、路由守卫、路由解析器、组件事件发射器和许多其他地方都支持可观察对象。
Angular 团队付出了很多努力来支持 promises 作为许多这些功能的后备,但在幕后,这些 promises 无论如何都只是转换为可观察的。
通过使 Http 请求可观察,Angular 团队正在使核心中的异步操作与其他地方的一切保持一致。
与 promises 相比,observables 仍然有一些优势,但这主要是固执己见的(正如我自己的观点)。
- 您可以轻松地在服务中混合使用 Http 请求和 WebSocket,并将 API 公开为可观察对象。服务的消费者不会知道其中的区别。
- 您可以轻松地将对数组的 Http 请求转换为单独发出每个项目的可观察对象。这使得将数据分派给不同的消费者变得容易得多。
- 如果未正确链接,Promise 可能会中断。 Observables 通常可以避免这些常见错误。