javascript – RXJS重试时重置等待间隔

我想用增加的时间间隔触发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)
  );
点赞