RXJS重试重置等待间隔

dur*_*rao 6 javascript rxjs rxjs5 angular angular5

我想随着时间间隔的增加触发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);
    });
});
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常。当前执行输出:

连接错误时(第一次)


  • [socket]等待1秒钟,然后重试!//等待1秒
  • [socket]等待2秒钟,然后重试!//等待2秒

连接成功


//成功连接。

连接错误时(第二次)


  • [socket] 等待3秒钟,然后重试!//等待3秒
  • [socket] 等待4秒钟,然后重试!//等待4秒

现在,我想重置套接字连接成功时的等待时间。

期望的输出:

连接错误时(第一次)


  • [socket]等待1秒钟,然后重试!//等待1秒
  • [socket]等待2秒钟,然后重试!//等待2秒

连接成功


//成功连接。

连接错误时(第二次)


  • [socket] 等待1秒钟,然后重试!//等待1秒

  • [socket] 等待2秒钟,然后重试!//等待2秒

但我不知道如何重设retrywhen()时间间隔。

小智 0

我最近通过使用 retryWhen 处理程序的辅助类解决了这个问题。这是在 RxJava 而不是 RxJS 中,但我认为概念是相同的。就我而言,如果超出了最大重试次数,我想出错,因此您可能需要调整该部分以满足您的需要。

private static class RetryWhenHandler implements Function<Observable<? extends Throwable>, Observable<?>> {
    int retryCount = 0;

    @Override
    public Observable<?> apply(Observable<? extends Throwable> attempts) throws Exception {
        if (++retryCount <= MAX_RETRIES) {
            return Observable.timer(i, TimeUnit.Seconds);
        } else {
            return Observable.error(throwable);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在上面的示例中:

RetryWhenHandler myHandler = new RetryWhenHandler();

socketResponse
    .doOnNext(ignored -> myHandler.retryCount = 0)
    .retryWhen(myHandler);
Run Code Online (Sandbox Code Playgroud)

每当您从可观察到的更新获得更新时,这都应该重置您的 retryCount,以便下次遇到错误时它为 0。