问题描述
示例代码:
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,它应该在失去连接时重新连接。
所以我集成了一个retrywhen
。 repeatWhen
是针对 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...'))
);
};