提问者:小点点

在Angular 2的rxjs中使用SwitchMap运算符时,我们必须取消订阅吗?


在Angular 2中,有一些你不需要取消订阅的可观察对象。例如超文本传输协议请求和激活路由。

Angular/RxJs我什么时候应该取消订阅

但是,当我在例如active atedRoute. params上使用SwitchMap并在该SwitchMap中访问一个服务时会发生什么,该服务返回一个可观察的对象,如果以通常的方式订阅,则需要取消订阅。

像这样的东西:

this.activatedRoute.params
    .switchMap((params: Params) => this.userService.getUser(+params['id']))
    .subscribe((user: User) => this.user = user);

如果我调用this. userService而没有切换映射并且没有激活Route.params,我将不得不取消订阅它。

// userService.getUser() takes in optional id?: number.
this.subscription = this.userService.getUser().subscribe(
    (user: User) => {
        this.user = user;
    }
 );

然后后来…

this.subscription.unsubscribe();

我的问题是,如果我在其上使用SwitchMap并调用需要取消订阅的服务,我是否需要取消订阅ActivatedRoute. params?


共3个答案

匿名用户

如果您订阅的源可观察始终完成或错误,则无需取消订阅。

但是,如果您使用SwitchMap从源代码编写另一个可观察对象,您是否需要取消订阅取决于SwitchMap中返回的可观察对象。如果返回的可观察对象并不总是完整或错误,那么,是的,您将需要取消订阅。

如果源错误,将发生自动取消订阅:

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>

匿名用户

switch chMap在以前的和新的可观察对象之间创建一个链接。如果您更改第一个可观察对象,则将始终触发第二个。

SwitchMap之后订阅的任何内容都将在初始可观察对象和返回的可观察对象上听到更改。

要完全停止第一个可观察对象以更新第二个或其余部分,请使用采取采取直到采取虽然。像:

const howTimerWorks = interval(5000).pipe(
  take(2), // only get 2 responses after 5 seconds each
  switchMap(initialNumber => interval(1000)));

// 0 after 5s, then 1, 2 , 3, (new Subs) 0, 1, ... every sec, forever now.
howTimerWorks.subscribe(console.log)

匿名用户

新的RxJS留档解释了在异常传播过程中,SwitchMap何时会继续侦听,何时会停止。

请参阅iWillContinueListning和iWillStopListning演示:

https://www.learnrxjs.io/learn-rxjs/operators/error_handling/catch