为什么 switchMap 不取消之前的观察者?

Why switchMap does not cancel previous observer?

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

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()五次,它会每秒向服务器发送五个请求。为什么switchMap不取消最后一个观察者?

因为每次调用 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();
}

实际实施取决于您要实现的目标,但希望您明白与现在的不同之处。