Почему switchMap не отменяет предыдущего наблюдателя? - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть метод, описанный в компоненте (контроллере):

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 не отменяет последний наблюдатель?

1 Ответ

0 голосов
/ 04 декабря 2018

Потому что каждый раз, когда вы звоните 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();
}

Фактическая реализация зависит от того, чего именно вы пытаетесь достичь, но, надеюсь, вы поймете, что отличается от того, что у вас есть сейчас.

...