在 Angular 中,在服务或组件中哪里订阅以及为什么?

Ali*_*avi 5 service subscribe angular

这个问题很常见,有些人喜欢在服务中使用,有些则在组件中使用:

Angular 2 订阅组件或服务?:它说永远不要从组件进行手动订阅!

如果我们不需要任何数据那么为什么我们需要订阅(服务中)?何时取消订阅将被调用?

如果我们从组件订阅:

 this.serviceA.getMethodObservable().subscribe(data => {
      this.data = data;
 });
Run Code Online (Sandbox Code Playgroud)

注意:订阅永远不会取消订阅!

如果 Observable 无法自行完成,那么整个组件、模板和所有关联对象将永远存在于内存中。

为此我们使用

 // onDestroy: subject
 this.serviceA.getMethodObservable()
   .pipe(takeUntil(this.onDestroy))
   .subscribe(data => {
      this.data = data;
 });

 ngOnDestroy() {
    this.onDestroy.next();
 }
Run Code Online (Sandbox Code Playgroud)

这是一个需要详细讨论并了解任何方法的利弊的问题!所以我的问题是哪一个以及为什么?

Twi*_*her 6

简而言之:

  • 订阅服务:并不是很有用,因为服务旨在保存状态、共享此状态并通知状态更改。服务并不是为了对状态变化做出反应而设计的
  • 在组件中订阅:Observable永远不会完成并且您没有在ngOnDestroy生命周期挂钩中手动取消订阅时,这是不安全的
  • 让框架为您订阅(例如:使用async管道)。安全,因为没有挂起订阅导致内存泄漏的风险。借助 rxjs 运算符,您仍然可以向模板公开pipedObservable并在组件级别执行各种操作,而不会面临任何内存泄漏的风险(即使回调引用this