我正在使用 RXJS 6,我尝试使用自适应超时重试(我第一次尝试 1s 超时,如果不成功我重试但 2s 超时,等等...)
看起来超时值在重试时没有更新,我是 RxJS 的新手,我找不到问题。
这里的代码片段:
import { zip, timer, range, of, pipe } from 'rxjs';
import { tap, retry, concatMap, timeout, catchError, delay, retryWhen } from 'rxjs/operators';
let timeoutFactor = 1;
let timeoutInit = 2000;
let timeoutValue = timeoutInit;
// simulate request
function makeRequest(timeToDelay) {
return of('Request Complete! '+timeToDelay).pipe(
tap( () => console.log(`doing request (${timeToDelay}ms) with timeout of ${timeoutValue}`)),
delay(timeToDelay));
}
const obs$ = of(4000, 3000, 2000)
.pipe(
concatMap(duration => makeRequest(duration).pipe(
timeout(timeoutValue),
retryWhen(error => zip(error, range(1,3).pipe(
tap( i => {
console.log("set timeout on " + (i*1000) + " ms")
setTimeoutFactor(i);
})
)))
))
);
obs$.subscribe(
val => console.log(val),
err => console.log(`err: ${err}` ),
() => console.log(`complete` ));
function setTimeoutFactor(value){
timeoutValue = timeoutInit*value;
}
但我的结果并不是很好:
doing request (4000ms) with timeout of 2000
set timeout on 1000 ms
set timeout on 2000 ms
set timeout on 3000 ms
doing request (4000ms) with timeout of 6000
doing request (4000ms) with timeout of 6000
doing request (4000ms) with timeout of 6000
doing request (3000ms) with timeout of 6000
timeout: 6000
Request Complete! 3000
doing request (2000ms) with timeout of 6000
timeout: 6000
Request Complete! 2000
complete
有什么帮助吗?