【问题标题】:Must I always unsubscribe from Observables to which I have subscribed?我必须总是取消订阅我订阅的 Observables 吗?
【发布时间】:2019-07-03 09:23:46
【问题描述】:

我有一个组件,它从返回 observable 的数据服务调用方法。 ngOnDestroy 方法中的 observable 是否必须取消订阅?

服务

public class BlogService {

   public getPosts(): Observable<Array<Post>> {
       return this.http.get('');
   }
}

组件

public class ListComponent implements OnInit {

   constructor(private blogService: BlogService) {}

   public ngOnInit() {
     this.blogService.getPosts().subscribe(posts => this.posts = posts);
   }
}

【问题讨论】:

  • 不是。完成的 observables 会自动取消订阅。 Http observables 在发射后完成。
  • 出错也会导致自动退订。因此,在这种情况下,只有在您担心组件会在 http 响应返回之前被销毁,并且如果您真的认为让组件保留在内存中直到响应返回是一个问题时,您才应该取消订阅。很可能不是。

标签: angular rxjs


【解决方案1】:

这就是我处理退订的方式:

  • 像 ritaj 所说的响应后,HttpServices 完成 -> 不需要取消订阅
  • 自行创建的 Subjects、Observables 等应取消订阅或由您自己完成
  • 角度中的异步管道自动取消订阅
  • 使用库中的 observables -> 这取决于提供的 observables 完成与否的天气
  • 使用 take(1) 或 takeUntil 等管道函数也可用于取消订阅

【讨论】:

    【解决方案2】:

    在您的情况下没有必要,但可以作为额外的预防措施,以防您将来更改 getPosts 方法的实现。

    一般:

    Finite Observables(例如从 Angular Http 客户端方法返回的那些)不需要您取消订阅,因为它们会完成,然后会自动取消订阅任何 Observers。

    Infinite Observables(例如 NgRx 商店)确实需要您取消订阅,因为它们没有完成。

    【讨论】:

      【解决方案3】:

      正如其他两个答案中提到的,您只需要取消订阅 Infinite Observables 而不是 Finite。例如:

      Infinite Observables — When you have an infinite sequence, you should unsubscribe, for example when using the interval() or the fromEvent() observables.

      下面的文章提供了您需要/不需要取消订阅的场景示例。

      源代码:https://netbasal.com/when-to-unsubscribe-in-angular-d61c6b21bad3

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-27
        • 2017-03-26
        • 2020-10-28
        • 2017-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-05
        相关资源
        最近更新 更多