Rxjs retry()操作符未触发重试问题求助
RxJS retry() 不重试的问题及解决办法
你的问题核心在于:simulateHttpRequest()只被调用了一次,生成的Observable在创建时就已经确定了成功或失败的结果。retry(3)的作用是重复订阅同一个Observable,而非重新执行请求逻辑生成新的Observable,所以即使触发重试,结果也和第一次完全一致,看起来就像只执行了一次。
要实现失败时重新发起请求的效果,需要用defer()操作符把请求逻辑包装成Observable工厂,让每次订阅(包括重试时的订阅)都重新执行请求代码:
simulateHttpRequest() { const shouldSucceed = Math.random() < 0.1; // 10% chance of success if (shouldSucceed) { return of('Random response'); } else { return throwError(() => new Error('Random error')); } } makeCall() { defer(() => this.simulateHttpRequest()).pipe( retry(3) // 现在会最多重试3次,每次都重新执行请求逻辑 ).subscribe({ next: o => console.log(o), error: o => console.error(o) // 只有4次请求都失败时才会触发 }); }
关键说明
defer()接收一个返回Observable的函数,每次订阅它生成的Observable时,都会调用传入的函数,生成全新的Observable实例。- 这样
retry(3)触发重试时,会重新调用simulateHttpRequest(),重新生成随机的成功/失败结果,完全符合你期望的最多重试3次的逻辑。
内容的提问来源于stack exchange,提问作者Misko Jones
相关产品推荐
相关产品推荐

