我们是不是需要取消订阅 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 是不是需要取消订阅?