【问题标题】:Angular Http - toPromise or subscribeAngular Http - toPromise 或订阅
【发布时间】:2016-09-01 07:41:39
【问题描述】:

我看过一些关于 Angular 的课程,发现有不同的方法来管理来自 Http 请求的数据。

  • 使用 Observables,.map().subscribe()
  • 使用承诺,.toPromise().then().catch()

我在我的应用程序中使用了toPromise(),因为我发现它类似于 AngularJS Http 服务。

在什么情况下我需要使用 Observables?

【问题讨论】:

  • Angular2 严重依赖Observables。为了一致性,我宁愿使用subscribe()

标签: angularjs angular angular2-services


【解决方案1】:

如果您喜欢反应式编程风格并希望在您的应用程序中保持一致,即使对于单个事件(而不是事件流)也始终使用可观察对象,那么请使用可观察对象。如果这对您来说无关紧要,请使用toPromise()

observables 的一个优点是,您可以取消请求。

另见Angular - Promise vs Observable

【讨论】:

  • 我只会在教程中添加 Observable 优势的好例子:angular.io/docs/ts/latest/tutorial/…(延迟搜索)
  • 如果您知道某个特定数据是固定的而不是流,该怎么办?当然,这应该作为承诺返回?为您知道不会随时间变化的数据设置订阅 Observable 听起来很浪费资源。
  • 等待承诺的完成与订阅没有什么不同。如果您认为这会对性能产生负面影响,您应该进行自己的基准测试。如果没有检查关键代码的基准,出于性能原因避免承诺可能是过早的优化。
  • 除非订阅 Observable 并没有真正完成;它坐在那里监听更改,直到您取消订阅或您的应用程序完成。这不是它的工作原理吗?
  • 快速搜索发现 medium.com/@benlesh/rxjs-dont-unsubscribe-6753ed4fda87 可能对您有所帮助。当 observable 关闭时,您不需要取消订阅。如果您有一个像 http 这样的 observable,它将在一个事件后关闭,对于其他人,您可以使用 first() 将其转换为一个在一个事件后关闭的对象。
【解决方案2】:

我认为只要响应不是您要使用的数据流,那么您最好使用.toPromise() 方法,因为继续收听您不需要的响应是没有意义的它甚至不会改变。

更新

.toPromise() 现在在 RxJS 7 中已弃用,他们用更好的 firstValueFromlastValueFrom 替换它。

所以您的代码应该如下所示:
await lastValueFrom(httpRequest$)

有关此检查的更多信息,请查看以下链接:
https://rxjs.dev/deprecations/to-promise
https://www.youtube.com/watch?v=3aeK5SfWBSU

【讨论】:

    【解决方案3】:

    Angular 中的默认 http 请求会发出 observables。可以通过调用 toPromise() 将其转换为 Promise。但这不是必需的。一旦通过调用解决http请求,Angular就会取消订阅

       `_xhr.removeEventListener('load', onLoad);
        _xhr.removeEventListener('error', onError);
        _xhr.abort();`
    

    Observables 是可取消的,但 Promise 不是。

    即使组件被销毁导致内存泄漏,打开请求仍然存在,这可以通过取消订阅 observable 或在组件被销毁后调用destroy方法来防止。 Ways to unsubscribe to prevent memory leaks

    结论,最好使用带有内存泄漏预防技术的可观察对象。

    【讨论】:

    • 您的链接已损坏。
    • @shaneparsons 感谢您指出这一点。更新了链接。看起来深度博客已移至中等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2021-07-10
    • 2020-10-11
    • 2018-01-17
    相关资源
    最近更新 更多