【问题标题】:Why switchMap does not cancel previous observer?为什么 switchMap 不取消之前的观察者?
【发布时间】:2018-12-04 18:42:00
【问题描述】:

我有组件(控制器)中描述的方法:

public requestPassportData(): void {
    const th = this;
    const data = {
      get_scanned_data: true
    };

    Observable.timer(0, 1000)
      .switchMap(() => this.requestMethods.requestPassportData(data))
      .takeWhile(() => {
        return (
          th.formRegister.currentForm().index == 1 ||
          th.formRegister.currentForm().index == 2 ||
          th.formRegister.currentForm().index == 3
        );
      })
      .subscribe(response => {});
}

如果调用方法requestPassportData() 5 次,它将每秒向服务器发送5 个请求。为什么switchMap不取消最后一个观察者?

【问题讨论】:

  • 也许takeWhile 限制这样做?

标签: angular rxjs rxjs5


【解决方案1】:

因为每次您调用requestPassportData() 时,您都会使用新的Observable.timer 创建一个与之前的调用无关的新链。

显然有多种方法可以解决这个问题,但您可以例如执行以下操作:

private requestPasswordSubject$ = new Subject();

private requestPassword = this.requestPasswordSubject$
  .switchMap(() => Observable.timer(0, 1000)
    .switchMap(() => this.requestMethods.requestPassportData(data))
    .takeWhile(() => {
      return (
         th.formRegister.currentForm().index == 1 ||
         th.formRegister.currentForm().index == 2 ||
         th.formRegister.currentForm().index == 3
      );
    });
  )
  .subscribe(response => {});

public requestPassportData(): void {
  ...
  this.requestPasswordSubject$.next();
}

实际实施取决于您想要实现的具体目标,但希望您能明白与现在不同的地方。

【讨论】:

  • 如何在里面传递thdata
  • requestPasswordSubject$ 不支持 swithMap
  • 我试过:` Observable.of(1) .switchMap(() => Observable.timer(0, 1000) .switchMap(() => this.requestMethods.requestPassportData(data)) 。 takeWhile(() => { return ( th.formRegister.currentForm().index == 1 || th.formRegister.currentForm().index == 2 || th.formRegister.currentForm().index == 3 ) ; }) ) .subscribe()}`
  • 如果 requestPasswordSubject$ 不支持 swithMap,则尝试将该主题转换为 observable。 this.requestPasswordSubject$.asObservable().switchMap()
  • Subject 继承自 Observable,因此所有可用于 Observable 的操作符也可用于 Subjects。
猜你喜欢
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
  • 2018-10-18
相关资源
最近更新 更多