Это мой код:
const searchBooks$: Observable<Book[]> = fromEvent(
this.filter.nativeElement,
'keyup'
).pipe(
debounceTime(500),
map((e: any) => {
console.info('map');
return e.target.value;
}),
distinctUntilChanged(),
concatMap((search) => this.bs.getBooks(search)),
shareReplay(),
retryWhen((errors) => {
console.info('error.. retrying n 2 seconds');
return errors.pipe(delayWhen(() => timer(2000)));
})
);
когда конечная точка терпит неудачу в this.bs.getBooks(поиск), я получаю исключение в повторить попытку когда, но через 2 секунды повторная попытка не выполняется.
Что я делаю не так?
Вместо concatMap я бы использовал switchMap, чтобы, если пользователь вводит новый символ, текущий вызов бэкэнда «отменялся» (не наблюдался, если возвращался результат) и создавался новый. Я бы также поставил retryWhen исключительно на вызов бэкенда, а не на весь поток:
const searchBooks$: Observable<Book[]> = fromEvent(
this.filter.nativeElement,
'keyup'
).pipe(
debounceTime(500),
map((e: any) => e.target.value),
tap(data => console.info(data)),
distinctUntilChanged(),
switchMap((search) =>
this.bs.getBooks(search)
.pipe(retryWhen((errors) => errors.pipe(
tap(error => console.info('error.. retrying n 2 seconds')),
delayWhen(() => timer(2000))
)))
),
shareReplay(),
);
Не могли бы вы попробовать поставить
shareReplay()
в конец или удалить его, если это возможно?