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

Posted

技术标签:

【中文标题】我们是不是需要取消订阅 Angular 中的 http 调用? [复制]【英文标题】:Do we need to unsubscribe from http calls in Angular? [duplicate]我们是否需要取消订阅 Angular 中的 http 调用? [复制] 【发布时间】:2018-07-09 01:03:31 【问题描述】:

可能是一个愚蠢的问题,但无法轻易找到答案。

在一个 Angular 应用程序中,我使用 Rxjs 进行 http 调用以获取数据并将其发布到服务器。假设我有一个服务MyService,其方法如下:

getData() 
  this.http
      .get("mybackendurl/mydata")
      .map(res => res.json())
      .subscribe(data => this.data = data);

所以,假设我在几个地方使用这种方法,并且每次我导航到一个页面时。 不管这样做是否方便,我的问题是,这不像一个承诺,它开始和结束,据我所知,这会保持连接打开,直到源终止,所以我需要以某种方式取消订阅每次我完成请求?

由于订阅是在服务中而不是在组件中完成的,因此服务不会被破坏,因此我担心我可能会创建多个订阅和连接,而不是重复使用同一个。

谢谢!

【问题讨论】:

注意你的冷/热 Observables (medium.com/@benlesh/hot-vs-cold-observables-f8094ed53339)。一个热的可以发射多次,例如您调用 .next() 的主题。其他的,比如 http 调用给你一个冷的 Observable,它只完成(或失败)一次。 【参考方案1】:

对于 Http 请求,您无需取消订阅。它实际上完成 observable,因此您将没有任何内存泄漏

您可以使用Subscription 对象的add 函数来检查这一点。取消订阅时调用此函数。您也可以通过将complete 函数(第三个参数)传递给subscribe 函数来检查,该函数将在请求之后调用,这意味着observable 已完成。

this.http
    .get("mybackendurl/mydata")
    .map(res => res.json())
    .subscribe(data => this.data = data)
    .add(() => console.log('Unsubscribed'));

【讨论】:

以上是关于我们是不是需要取消订阅 Angular 中的 http 调用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2 - 订阅 FormControl 的 valueChanges 是不是需要取消订阅?

组件 ngOnInit 中的 Angular 订阅

我需要手动取消订阅吗? - Angular 8 [重复]

取消订阅 Angular 中的 observable

我应该取消订阅根 Angular 组件中的 observables 吗?

Angular HttpClient取消订阅[重复]