【问题标题】:What happens to subscription if you don't assign it to a variable?如果您不将订阅分配给变量,会发生什么情况?
【发布时间】:2017-11-23 16:56:54
【问题描述】:

我试图弄清楚为什么我看到的所有 Angular 应用程序都将订阅分配给一个变量,而只需要通过 ngOnDestroy() 取消订阅。例如:

export class ViewBookPageComponent implements OnDestroy {
  actionsSubscription: Subscription;

  constructor(store: Store<fromRoot.State>, route: ActivatedRoute) {
    this.actionsSubscription = route.params
      .select<string>('id')
      .map(id => new book.SelectAction(id))
      .subscribe(store);
  }

  ngOnDestroy() {
    this.actionsSubscription.unsubscribe();
  }
}

如果我完全删除 actionsSubscription 会发生什么?订阅是否仍会被创建但不会被销毁?在以下情况下,您仍然会得到副作用,但不必费心退订。那么垃圾回收需要 actionsSubscription 吗?

export class ViewBookPageComponent {

  constructor(store: Store<fromRoot.State>, route: ActivatedRoute) {
    route.params
      .select<string>('id')
      .map(id => new book.SelectAction(id))
      .subscribe(store);
  }

}

【问题讨论】:

    标签: angular


    【解决方案1】:

    你是对的,如果你完全删除actionsSubscriptionsubscription 仍将被创建,但你将无法通过ngOnDestroy 从中获取unsubscribe,在你离开组件后。如果没有取消订阅,observable 可能仍会保留流数据,即使在离开组件之后也是如此,从而导致内存泄漏。因此,将 observable 订阅分配给变量并强制 unsubscribe 确保来自该 observable 的数据流在组件被销毁时停止。

    我从 Brian Love 的 article 中了解了更多关于 unsubscribe 的信息。

    我从中注意到了一件重要的事情 -

    如果您通过AsyncPipe 使用可观察流,那么您不需要 需要担心退订。异步管道将负责 为您订阅和退订。

    希望这会有所帮助。

    【讨论】:

    • 感谢您的快速回复!另一个问题:如果我完全放弃 .subscribe() 并留下 .map() 并保留 SelectAction 的副作用怎么办? observable 会继续发射,还是会因为没有订阅者而与组件一起死亡?
    • 来自 angular.io,“subscribe() 方法返回一个订阅。订阅不是另一个 Observable。它是 Observables 的行尾。你不能在它上面调用 map() 或再次调用 subscribe()。Subscription 对象有不同的用途,由它的主要方法 unsubscribe 表示。”简而言之,observable 在使用 subscribe() 订阅之前不会开始工作。
    • 知道了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 2017-09-15
    • 2016-01-10
    相关资源
    最近更新 更多