我想用增加的时间间隔触发retrywhen(),
socketResponse.retryWhen(attempts => {
return attempts.zip(Observable.range(1, 4)).mergeMap(([error, i]) => {
console.log(`[socket] Wait ${i} seconds, then retry!`);
if (i === 4) {
console.log(`[socket] maxReconnectAttempts ${i} reached!`);
}
return Observable.timer(i * 1000);
});
});
上面的代码工作正常.
当前实施输出:
连接错误(第1次)
> [socket]等待1秒钟,然后重试! //等待1秒
> [socket]等待2秒,然后重试! //等待2秒
在连接成功
//成功连接
连接错误(第2次)
> [socket]等待3秒,然后重试! //等待3秒
> [socket]等待4秒,然后重试! //等待4秒
现在我想重置套接字连接成功的等待时间.
期望的输出:
连接错误(第1次)
> [socket]等待1秒钟,然后重试! //等待1秒
> [socket]等待2秒,然后重试! //等待2秒
在连接成功
//成功连接
连接错误(第2次)
> [socket]等待1秒钟,然后重试! //等待1秒
> [socket]等待2秒,然后重试! //等待2秒
但我不知道如何重置retrywhen()时间间隔.
最佳答案 使用delayWhen创建一个通知函数,该函数在每次错误发生后以增加的延迟发出.在下面的片段中,我正在重试增加0.5秒的倍数.但是,如果需要,您可以使用不同的时间序列.在这里,我还展示了如何限制重试次数并在这种情况下抛出错误.
socketResponse$
.pipe(
retryWhen(errors =>
errors.pipe(
// delay(500), // fix delay: 0.5 sec
delayWhen((_,i) => timer(i*500)), // increasing delay: 0.5 sec multiple
tap(_ => console.log('retrying...')),
take(2), // max. retries: 2 x
concat(throwError('number of retries exceeded'))
)
)
)
.subscribe(
x => console.log('value:', x),
e => console.error('error:', e)
);