【问题标题】:Angular/RxJS: Max number of subscriptions?Angular/RxJS:最大订阅数?
【发布时间】:2021-11-04 09:26:27
【问题描述】:

我正在创建一个指令,该指令根据用户的时区格式化日期。用户可以选择通过页面上的设置下拉菜单更新他们的时区。因此,该指令订阅时区更新和更新更新。

ngOnInit() {
    this.timezoneUpdatedSubscription = this.commonService.timezoneUpdated.subscribe(() => {
        this.el.nativeElement.innerHTML = moment(this.localDate).tz(this.commonService.usersTimezone).format(this.format);
    })
}

ngOnDestroy() {
    if (this.timezoneUpdatedSubscription) {
        this.timezoneUpdatedSubscription.unsubscribe();
    }
}

可能的问题是该指令可能会在一个页面上使用很多次,可能会使用 50 次,但有时可能会使用 200 多次。这意味着一次可能有 200 多个订阅。

这会导致一次更新大量元素的性能问题吗?我看不到任何文件可以建议任何一种方式。

【问题讨论】:

  • 如果您的意思是订阅/取消订阅的最佳做法是什么,那么代码看起来不错。如果使用此指令的所有元素的父组件都相同,那么您可以在组件级别订阅一次,然后将您的解决方案转换为pipe,然后将时区传递给pipe
  • 抱歉澄清了这个问题 - 我的意思更多的是一次更新大量元素的性能
  • 在性能方面,您应该禁用默认运行的角度变化检测。它可以为您节省大量与性能相关的调整。如果您使用任何状态管理库,这将很容易。

标签: angular rxjs rxjs-subscriptions


【解决方案1】:

这取决于您如何使用它。通常,ngOnDestroy 钩子有助于删除此类订阅,前提是该组件正在被销毁。如果您每次都推送新组件而不删除它,是的,它会造成内存泄漏。只有当我们销毁组件并重新渲染它时,它才会取消订阅,在这种情况下它不会导致任何内存泄漏。

我不确定您如何使用给定的代码,但我建议您使用pipe 更改视图格式。如果您想保留此格式化日期以供将来使用,则可以使用 subs/pub 模式。

【讨论】:

  • 感谢 Apoorva。肯定会破坏组件并取消订阅,所以我认为它可以避免内存泄漏。此外,不使用管道的原因是它不会在时区更改时更新,因为管道仅在输入更改时更新,而不是“修饰符”。
  • 是的,管道可能有点棘手。但是,当您更新视图角度上的任何属性时,默认情况下会运行更改检测,或者您可以运行它,这可能会帮助您使用管道。无论如何,答案对您有帮助吗?或者您正在寻找特定的东西?
猜你喜欢
  • 2021-12-19
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 2021-12-14
  • 1970-01-01
相关资源
最近更新 更多