加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在Angular 2中的rxjs中使用switchMap运算符时,我们是否必须取消

发布时间:2020-12-17 06:49:15 所属栏目:安全 来源:网络整理
导读:在Angular 2中,有一些您不需要取消订阅的可观察对象.例如http requests和activatedRoute.params. Angular/RxJs When should I unsubscribe from `Subscription` 但是当我使用switchMap时会发生什么情况,例如activatedRoute.params,并且在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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读