RxJS中retryWhen已弃用,如何替换结合bufferWhen的retryWhen?
替代RxJS已弃用的retryWhen操作符方案
在RxJS 7及以上版本中,retryWhen已被官方弃用,推荐使用带有配置项的retry操作符来实现自定义重试逻辑,完全可以替代你原代码中retryWhen结合bufferWhen的功能。
核心思路
你原代码的逻辑是:当webBusy为true时抛出错误,等待doNextAct$发出信号后触发重试。新版retry的delay配置支持传入一个函数,该函数接收错误并返回一个Observable——当这个Observable发出值时,就会触发重试,正好匹配你等待doNextAct$信号的需求。
改写后的代码
of(1) .pipe( tap(() => { if (this.webBusy) { throw 2; } }), // 用带配置的retry替代retryWhen retry({ delay: (err) => { console.log(`Nav ${err} WebBusy`); // 等待doNextAct$发出值后触发重试 return this.doNextAct$; }, // 可选:限制重试次数,不写则无限重试 // count: Infinity, // 可选:仅在特定错误时重试,避免无关错误触发重试 shouldRetry: (err) => err === 2 }), switchMap((resp: SvcResponse) => { this.webBusy = true; return api.doAct(navData); }), tap((resp: SvcResponse) => { this.webBusy = false; this.doNextAct$.next(1); }), ).subscribe();
关于bufferWhen的替代
如果你确实需要缓冲多个错误,直到doNextAct$发出后再一次性重试(原代码中bufferWhen的逻辑),可以在delay函数内嵌套bufferWhen:
retry({ delay: (err) => { console.log(`Nav ${err} WebBusy`); return of(err).pipe( bufferWhen(() => this.doNextAct$), map(() => null) // 转换为可触发重试的信号 ); } })
不过大多数场景下,第一种直接返回doNextAct$的写法已经能满足需求,更简洁高效。
内容的提问来源于stack exchange,提问作者Hamid Taebi
相关产品推荐
相关产品推荐

