RxJS Observable 的订阅和取消

RxJS 是优秀的前端异步编程库。 对Observable 订阅处理,是关键要点。学习过程中,比较迷惑的是,对一个Observable的订阅,到底要不要手动取消?官方文档语焉不详。根据官方文档对取消函数unsubscribe() 的描述 “Disposes the resources held by the subscription” ,似乎每次订阅后,手动unsubscribe() 非常重要。但实践中发现,不是这样的。很多时候,不需要手动取消。

第一次发现这个问题,是实践中发现,如果发生错误,即Observable发出error时,订阅居然被RxJS自动取消了,导致Observable后续的变化,订阅者无法收到。这种情况下,显然已不再需要手动取消订阅。

多次实践发现,如下效果:

  1. Observable 发出 complete 或者 error 时,RxJS自动取消订阅,这时不再需要手动取消订阅。
  2. 对于Angular HttpClient 执行返回的 Observable,也不需要手动取消订阅,因为HttpClient是返回一次值,不会再有后续变化。如果,Angular HttpClient 执行成功,Angular在返回正常结果时,会跟着发出complete,从而根据上述第一条效果,调用者无需再次取消订阅。
  3. 对于Angular AsyncPipe,Angular 官方文档里,明确写了在离开页面销毁 component 的时候,会自动销毁 AsyncPipe 订阅的 Observables,因此调用者无需手动取消订阅。
  4. 通过 Subject,BehaviorSubject,AsyncSubject,ReplaySubject 在各个 Component 之间通信,需要调用 unsubscribe()取消订阅。
  5. RxJS 自带的一些操作符:take,takeWhile,first 等等,不需要调用 unsubscribe()取消订阅。

发表评论