RxJs中Observable.empty().delayWhen()无延迟及错误时暂停Observable问题
解决RxJS错误暂停与每3次询问用户的问题,以及empty().delayWhen失效的坑
首先咱们先搞定你核心的需求:让Observable在错误时暂停,每累计3次错误才弹出询问,等用户确认后再继续,同时跳过出错的那个值。之后再聊聊你遇到的empty().delayWhen的奇怪问题。
一、实现错误处理与用户确认逻辑
这里的关键是用retryWhen操作符拦截错误,搭配计数器统计错误次数,每3次触发一次用户确认,等用户操作后再恢复订阅。给你写个完整的示例:
const { Subject, Observable, of, catchError, retryWhen, switchMap } = Rx; // 模拟一个会随机出错的数据源 const source$ = new Subject(); // 错误计数器 let errorCount = 0; const handledSource$ = source$.pipe( // 捕获错误,计数后抛给retryWhen处理 catchError((err) => { errorCount++; throw err; }), retryWhen((errors$) => { return errors$.pipe( switchMap(() => { // 每3次错误触发用户确认 if (errorCount % 3 === 0) { // 模拟用户确认弹窗,返回一个等待用户操作的Observable return new Observable((observer) => { if (confirm(`已经出现${errorCount}次错误,是否继续?`)) { observer.next(); observer.complete(); } else { // 用户取消则直接结束流 observer.complete(); } }); } else { // 非3次倍数的错误,直接跳过继续订阅 return of(null); } }) ); }) ); // 订阅处理后的流 handledSource$.subscribe({ next: (val) => console.log('收到值:', val), complete: () => console.log('流结束'), error: (err) => console.log('错误:', err) }); // 模拟发送数据和错误 setTimeout(() => source$.next(1), 1000); setTimeout(() => source$.error('出错1'), 2000); setTimeout(() => source$.next(2), 3000); setTimeout(() => source$.error('出错2'), 4000); setTimeout(() => source$.next(3), 5000); setTimeout(() => source$.error('出错3'), 6000); // 这里会触发用户确认 setTimeout(() => source$.next(4), 7000);
二、聊聊Observable.empty().delayWhen(...)失效的坑
这其实是RxJS的一个小细节:Observable.empty()是立即完成的流,它不会发出任何值,而delayWhen只针对流中发出的值做延迟处理,对于完成通知不会干预。所以它会跟着empty()直接完成,表现得和empty()一模一样。
而Observable.empty().delay(...)能正常工作,是因为delay操作符会延迟流的完成通知,不管有没有值;of(null).delayWhen(...)能正常工作,是因为of(null)会发出一个null值,delayWhen可以针对这个值做延迟。
如果想要让空流配合delayWhen实现延迟效果,最简单的就是用of(null).delayWhen(...),或者也可以用finalize来延迟完成通知:
// 延迟empty()的完成通知 Observable.empty().pipe( finalize(() => new Promise(resolve => setTimeout(resolve, 1000))) );
总结
- 用
catchError+retryWhen的组合,就能实现每3次错误询问用户、同时跳过错误值的逻辑 empty().delayWhen失效是因为它没有值可延迟,换成of(null).delayWhen就能解决问题
内容的提问来源于stack exchange,提问作者ovg
相关产品推荐
相关产品推荐

