使用 retrywhen RxJs 时如何更新源
How to update the source when use retrywhen RxJs
我正在向 API 发出创建订单的请求,尝试使用相同代码创建订单时可能出错,因为方法 generateCode() 是一个随机生成器!
执行重试时,它使用相同的源,这意味着,在请求中使用相同的代码,它不会再次调用使用新代码创建新订单的方法 sendRequest()!
很遗憾,我无法更改generateCode() 方法来获取不重复代码!我必须使用这种方法来生成随机代码!
this.sendRequest()
.pipe(
this.retryStrategy(),
tap((response) => {
...
}),
catchError((error) => {
return EMPTY;
})
).subscribe();
sendRequest(): Observable<any> {
let order = {
code: generateCode()
};
return this.service.createOrder(order);
}
retryStrategy(delayDurationMs: number = 1000, maxRetryAttempts: number = 3) {
return (src: Observable<any>) => src.pipe(
retryWhen((errors: Observable<any>) => errors.pipe(
mergeMap((error, i) => {
const retryAttempt = i + 1;
console.log('%c retryAttempt: ' + retryAttempt, 'background: #fff; color: red');
if (maxRetryAttempts > retryAttempt) {
return timer(delayDurationMs);
}
return throwError(error)
}),
finalize(() => console.log('%c retry process has done!', 'background: #222; color: #bada55'))
))
)
}
尝试在你的sendRequest
方法中使用defer
进行扭曲,每次重试
时应该重新运行
sendRequest(): Observable<any> defer(()=>{
let order = {
code: generateCode()
};
return this.service.createOrder(order);
})
我正在向 API 发出创建订单的请求,尝试使用相同代码创建订单时可能出错,因为方法 generateCode() 是一个随机生成器!
执行重试时,它使用相同的源,这意味着,在请求中使用相同的代码,它不会再次调用使用新代码创建新订单的方法 sendRequest()!
很遗憾,我无法更改generateCode() 方法来获取不重复代码!我必须使用这种方法来生成随机代码!
this.sendRequest()
.pipe(
this.retryStrategy(),
tap((response) => {
...
}),
catchError((error) => {
return EMPTY;
})
).subscribe();
sendRequest(): Observable<any> {
let order = {
code: generateCode()
};
return this.service.createOrder(order);
}
retryStrategy(delayDurationMs: number = 1000, maxRetryAttempts: number = 3) {
return (src: Observable<any>) => src.pipe(
retryWhen((errors: Observable<any>) => errors.pipe(
mergeMap((error, i) => {
const retryAttempt = i + 1;
console.log('%c retryAttempt: ' + retryAttempt, 'background: #fff; color: red');
if (maxRetryAttempts > retryAttempt) {
return timer(delayDurationMs);
}
return throwError(error)
}),
finalize(() => console.log('%c retry process has done!', 'background: #222; color: #bada55'))
))
)
}
尝试在你的sendRequest
方法中使用defer
进行扭曲,每次重试
sendRequest(): Observable<any> defer(()=>{
let order = {
code: generateCode()
};
return this.service.createOrder(order);
})