Observable repeatWhen & retryWhen 其他 observable 为真网络已连接

问题描述

示例代码

const networkConnected = new BehaviorSubject<boolean>(false);

setTimeout(networkConnected.next(true),10000);

webSocket('ws://localhost:4949')
  .pipe(
    retrywhen(errors => errors.pipe(delay(10000),filter(() => networkConnected.value === true))),repeatWhen(completed => completed.pipe(delay(10000),tap(a => console.log('Connecting...'))
  ).subscribe(
    message=> console.info(message),error => console.error(error),() => console.warn('Completed'),);

搜索一个小时,但找不到其他想要相同的人。

一个 WebSocket,它应该在失去连接时重新连接。 所以我集成了一个retrywhenrepeatWhen 是针对 WebSocket 完成的情况...

现在我想添加一个逻辑,只在互联网连接正常时重新连接(重试/重复)。 所以当我的 networkConnected observable 是 true 时。 当它是 false 时,重新连接(重试/重复)应该等到它为真。

也许与zip有关?还是mergeMap? 或者,我添加一个每秒运行一次的 timer,并使用 skipUntil 检查该值是否为真。

但我认为你们中有人有更好的解决方案?

解决方法

我希望 networkConnectivity 是设置 websocket 的先决条件:

networkConnected
  .pipe(
    // do not want to re-open the websocket when the network is still connected
    distinctUntilChanged(),// when connected open the websocket,otherwise noop and wait till connected
    switchMap(isConnected => isConnected ? openWebsocket() : empty())
  )
  .subscribe(
    message=> console.info(message),error => console.error(error),() => console.warn('Completed')
  );

openWebsocket = () => {
  return webSocket('ws://localhost:4949')
    .pipe(
      // this works for websocket errors while networkConnected=true
      retryWhen(errors => errors.pipe(delay(10000)),repeatWhen(completed => completed.pipe(delay(10000)),tap(a => console.log('Connecting...'))
    );
};

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...