如何取消订阅由 Angular 服务创建的 observable [重复]

Posted

技术标签:

【中文标题】如何取消订阅由 Angular 服务创建的 observable [重复]【英文标题】:How to unsubscribe from observable created by an Angular Service [duplicate] 【发布时间】:2019-12-20 23:23:21 【问题描述】:

我对 Angular 还是很陌生,我的问题可能看起来很基础,但我们将不胜感激。我目前正在编写一个应用程序来教自己一些真正的开发技能。在我的应用程序中,我有一个 Angular 组件,它导入我编写的提供数据的服务。

这是我的组件

@Component(
  selector: 'music-instrument-list',
  templateUrl: './instrument-report.component.html',
  styleUrls: ['./instrument-report.component.css']
)
export class InstrumentReportComponent implements OnInit, OnDestroy 
    
    constructor(public apiService: ApiService) 
    public availableInstruments: any[];

    ngOnInit() 
        this.apiService.getInstruments().subscribe((result) => 
            this.availableInstruments = result;
        );
    

    ngOnDestroy() 
    // how do I unsubscribe?
    

这很简单,但如果我尝试将this.apiService.getInstruments.unsubscribe() 添加到ngOnDestroy 块中,我会收到错误消息,即 Property 'unsubscribe' 在 type => Observable' 上不存在。我什至考虑在.subscribe() 之后添加.unsubscribe() 之类的链接,但这只会让我的页面挂起。我也没有错误。有人可以告诉我如何最好地退订吗?我是否需要将 api 调用分配给一个变量,然后在 ngOnDestroy 块中的变量名称上使用 .unsubscribe()

【问题讨论】:

【参考方案1】:
@Component(
  selector: 'music-instrument-list',
  templateUrl: './instrument-report.component.html',
  styleUrls: ['./instrument-report.component.css'],
)
export class InstrumentReportComponent implements OnInit, OnDestroy 
  subscription: Subscription;
  constructor(public apiService: ApiService) 
  public availableInstruments: any[];

  ngOnInit() 
    this.subscription = this.apiService.getInstruments().subscribe((result) => 
      this.availableInstruments = result;
    );
  

  ngOnDestroy() 
    this.subscription.unsubscribe();
  

【讨论】:

【参考方案2】:

为避免内存泄漏,您可以从ObservableSubscription 取消订阅。 例如:

    subscription: Subscription;

    ngOnInit() 
        this.subscription = this.apiService.getInstruments().subscribe((result) => 
            this.availableInstruments = result;
        );
    

    ngOnDestroy() 
        this.subscription.unsubscribe();
    

或使用async 管道:

打字稿:

    instruments$;

    ngOnInit() 
        this.instruments$= this.apiService.getInstruments().subscribe((result) => 
            this.availableInstruments = result;
        );
    

HTML:

    <li *ngFor="let instr of instruments$ | async">
         instr | json  
    </li>

【讨论】:

谢谢,它对我有用!【参考方案3】:

在 Angular 中处理观察者的最新和更简洁的方法是在模板组件中使用异步管道,它将订阅和可观察对象的销毁委托给容器框架。 您可以在此处找到更详细的示例(角度文档): https://angular.io/api/common/AsyncPipe

【讨论】:

【参考方案4】:

您不应取消订阅自动完成的 observables(例如 Http、调用)。但是有必要取消订阅像Observable.timer() 这样的无限可观察对象。 unsubscribe from Angular HTTP calls

至于一般退订,这是一个重复的问题,在这里回答 How to unsubscribe for an observable

【讨论】:

以上是关于如何取消订阅由 Angular 服务创建的 observable [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular 4+ 中取消/取消订阅所有挂起的 HTTP 请求

我们是不是需要取消订阅 Angular 中的 http 调用? [复制]

如何在不订阅 Angular 表单提交的情况下创建/更新项目

如何在 Angular 2 中取消订阅 EventEmitter?

取消订阅 Angular 中的 observable

订阅/取消订阅 VS 创建/TakeUntil?