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(),
);
这是我的代码:
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(),
);