Angular项目WebSocket自动重连成功后执行指定代码的实现咨询
解决Angular WebSocket重连成功后执行方法的问题
我之前在Angular项目里做WebSocket自动重连的时候,也碰到过完全一样的困扰!retryWhen确实只在错误流里处理重试逻辑,要捕捉重连成功的时机,得换个思路——盯着连接成功的信号,而不是错误重试的结束节点。
核心思路
retryWhen负责在连接失败时发起重试,但重连成功的标志是新的WebSocket连接建立完成,这个信号会通过WebSocket的open事件发出。我们只需要监听这个事件,不管是首次连接还是重连后的连接,只要触发open就执行你的目标方法。
方案1:用RxJS webSocket的openObserver(推荐)
如果你用的是@angular/websocket提供的webSocket工具,它内置了openObserver配置项,专门用来监听连接打开事件,完美适配重连场景:
import { webSocket } from 'rxjs/webSocket'; import { retryWhen, delay, tap } from 'rxjs/operators'; // 创建WebSocket流 const wsConnection$ = webSocket({ url: 'wss://your-websocket-endpoint', // 监听连接打开事件(首次+重连后都会触发) openObserver: { next: () => { // 这里放你重连成功后要执行的方法 this.handleReconnectSuccess(); console.log('WebSocket连接成功(包括重连)'); } } }).pipe( // 你的自动重连逻辑 retryWhen(errors => errors.pipe( tap(err => console.error('连接失败,准备重试:', err)), delay(3000) // 延迟3秒重试 ) ) ); // 订阅流 wsConnection$.subscribe( message => console.log('收到消息:', message), err => console.error('WebSocket错误:', err), () => console.log('WebSocket连接关闭') );
方案2:手动创建WebSocket实例(自定义场景)
如果是你手动创建原生WebSocket实例,直接在onopen事件里绑定方法就行,每次重连创建新实例时都会触发这个事件:
private connectWebSocket(): void { const ws = new WebSocket('wss://your-websocket-endpoint'); // 连接成功时执行方法(首次+重连后) ws.onopen = () => { this.handleReconnectSuccess(); console.log('WebSocket连接成功'); }; ws.onmessage = (event) => { console.log('收到消息:', event.data); }; ws.onerror = (error) => { console.error('连接错误:', error); // 触发重连 setTimeout(() => this.connectWebSocket(), 3000); }; ws.onclose = () => { console.log('连接关闭,准备重连'); setTimeout(() => this.connectWebSocket(), 3000); }; }
为什么之前的do/tap没生效?
你之前在retryWhen里用tap(原do),其实是在错误重试的流程里操作,而不是在连接成功的主数据流里。重试成功后,新的连接会发出自己的open信号,这才是我们要捕捉的时机~
内容的提问来源于stack exchange,提问作者Marshal
相关产品推荐
相关产品推荐

