在Angular 2中的rxjs中使用switchMap运算符时,我们是否必须取消
在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? 解决方法
如果您订阅的源可观察对象总是完成或错误,则无需取消订阅.
但是,如果使用switchMap从源中组合另一个observable,是否需要取消订阅取决于switchMap中返回的observable.如果返回的observable并不总是完成或错误,那么,是的,您需要取消订阅. 如果源错误,将自动取消订阅: const source = new Rx.Subject(); const composed = source.switchMap(() => Rx.Observable.interval(200)); composed.subscribe(value => console.log(value)); source.next(1); setTimeout(() => { console.log("Erroring..."); source.error(new Error("Boom!")); },1000); .as-console-wrapper { max-height: 100% !important; top: 0; } <script src="https://unpkg.com/rxjs@5.4.1/bundles/Rx.min.js"></script> 但是,如果源完成,则不会发生自动取消订阅: const source = new Rx.Subject(); const composed = source.switchMap(() => Rx.Observable.interval(200)); composed.subscribe(value => console.log(value)); source.next(1); setTimeout(() => { console.log("Completing..."); source.complete(); },1000); .as-console-wrapper { max-height: 100% !important; top: 0; } <script src="https://unpkg.com/rxjs@5.4.1/bundles/Rx.min.js"></script> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 错误:没有模块:ngRoute尝试在angularjs中实现路由时
- angularjs – $TemplateCache或TemplateUrl for directive
- angularjs – 没有用户身份验证的安全REST API(无凭据)
- angularjs – AngularUI路由器中的活动链接/选项卡
- angularjs – 在角度模板中包含外部js小部件
- 关于webservice遇到的一些问题
- 构建项目后,Angular 2路由无法正常工作
- 从ensime运行sbt时scala – java.io.IOException?
- 在bash -o vi模式中是否有一种方法可以让提示符指示正常/命
- angularjs – Angular:过滤器中的无限摘要循环