如果您不将订阅分配给变量,会发生什么?

时间:2017-06-21 00:35:44

标签: angular

我试图弄清楚为什么我看到的所有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);
  }

}

1 个答案:

答案 0 :(得分:1)

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

我从Brian Love那里了解了# convert list into dictionary d = dict(tuple(passwords)) try: d[passwordToLookup] except KeyError: # what to do if no password available else: # what to do if available return d.get(passwordToLookup, default=None) 的更多信息。

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

  

如果您通过values = list(zip(*passwords)) try: the_password = values[1][values[0].index(passwordToLookup)] except ValueError: # what to do if no password available else: # what to do if available 使用可观察流,那么您不会   需要担心取消订阅。异步管道将负责   订阅和取消订阅。

希望这有帮助。