RxJs fromEvent 结合 retryWith

RxJs fromEvent combined with retryWith

这是我的代码:

const searchBooks$: Observable<Book[]> = fromEvent(
      this.filter.nativeElement,
      'keyup'
    ).pipe(
      debounceTime(500),
      map((e: any) => {
        console.log('map');
        return e.target.value;
      }),
      distinctUntilChanged(),
      concatMap((search) => this.bs.getBooks(search)),
      shareReplay(),
      retryWhen((errors) => {
        console.log('error.. retrying n 2 seconds');
        return errors.pipe(delayWhen(() => timer(2000)));
      })
    );

当端点在 this.bs.getBooks(search) 中失败时,我在 retryWhen 中收到异常,但 2 秒后没有执行重试。

我做错了什么?

我会使用 switchMap 而不是 concatMap,这样如果用户输入一个新字符,当前对后端的调用将被“取消”(如果返回结果则不会被观察到)和一个新的一个是制作的。我还会将 retryWhen 完全放在对后端的调用上,而不是整个流上:

const searchBooks$: Observable<Book[]> = fromEvent(
    this.filter.nativeElement,
    'keyup'
  ).pipe(
      debounceTime(500),
      map((e: any) => e.target.value),
      tap(data => console.log(data)),
      distinctUntilChanged(),
      switchMap((search) => 
         this.bs.getBooks(search)
            .pipe(retryWhen((errors) => errors.pipe(
               tap(error => console.log('error.. retrying n 2 seconds')),
               delayWhen(() => timer(2000))
            )))
      ),
      shareReplay(),
  );