微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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)
  );

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐