在Angular 2中,有一些您不需要取消订阅的可观察对象 . 例如http requests和activatedRoute.params .
Angular/RxJs When should I unsubscribe from Subscription
但是当我使用switchMap时会发生什么情况,例如activatedRoute.params,并且在switchMap内部我访问一个服务,该服务返回一个observable,如果以通常的方式订阅则需要取消订阅 .
像这样的东西:
this.activatedRoute.params
.switchMap((params: Params) => this.userService.getUser(+params['id']))
.subscribe((user: User) => this.user = user);
如果我在没有switchMap且没有activateRoute.params的情况下调用this.userService,我将不得不取消订阅 .
// userService.getUser() takes in optional id?: number.
this.subscription = this.userService.getUser().subscribe(
(user: User) => {
this.user = user;
}
);
然后......
this.subscription.unsubscribe();
我的问题是,如果我在其上使用switchMap并调用需要取消订阅的服务,是否需要取消订阅activatedRoute.params?
2 回答
如果您订阅的源可观察对象总是完成或错误,则无需取消订阅 .
但是,如果使用
switchMap
从源编写另一个observable,则是否需要取消订阅取决于switchMap
中返回的可观察量 . 如果返回的observable并不总是完成或错误,那么,是的,您需要取消订阅 .如果源错误,将自动取消订阅:
但是,如果源完成,则不会发生自动取消订阅:
执行切换映射后,订阅将附加到最后一个Observable . 如果第一个观察者保持触发,则无关紧要 . switchmap块只执行一次 .
如果永远不会关闭,你必须从最后一个取消订阅 .
检查此代码: