在一个应用中,websocket一般都是以单例形式存在的,即在整个应用中,websocket实例始终保持唯一。但有时我们要用到websocket实例的时候,可能websocket还没实例化,所以要做成异步的形式来获取实例。
一、封装。先创建 socket.ts 文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
import EventEmitter from 'events' ; // 这里用到了 events 包 const ee = new EventEmitter(); class Ws { private wsUrl: string = '' ; private socket: WebSocket | undefined; // socket实例 private lockReconnect: boolean = false ; // 重连锁 private timeout: NodeJS.Timeout | undefined; // 初始化socket,一般在应用启动时初始化一次就好了,或者需要更换wsUrl public init(wsUrl: string) { this .wsUrl = wsUrl; this .createWebSocket(); } // 获取socket实例 public getInstance(): Promise<WebSocket> { return new Promise((resolve, reject) => { if ( this .socket) { resolve( this .socket); } else { ee.on( 'socket' , (state: string) => { if (state === 'success' ) { resolve( this .socket); } else { reject(); } }); } }); } // 创建socket private createWebSocket() { try { console.log( 'websocket 开始链接' ); const socket = new WebSocket( this .wsUrl); socket.addEventListener( 'close' , () => { console.log( 'websocket 链接关闭' ); this .socket = undefined; this .reconnect(); }); socket.addEventListener( 'error' , () => { console.log( 'websocket 发生异常了' ); this .socket = undefined; this .reconnect(); }); socket.addEventListener( 'open' , () => { // 可在此进行心跳检测 // this.heartCheck.start(); console.log( 'websocket open' ); this .socket = socket; ee.emit( 'socket' , 'success' ); }); socket.addEventListener( 'message' , (event) => { console.log( 'websocket 接收到消息' , event); }); } catch (e) { console.log( 'socket catch error' , e); this .reconnect(); } } // 重连 private reconnect() { if ( this .lockReconnect) { return ; } console.log( 'websocket 正在重新连接' ); this .lockReconnect = true ; //没连接上会一直重连,设置延迟避免请求过多 this .timeout && clearTimeout( this .timeout); this .timeout = setTimeout(() => { this .createWebSocket(); this .lockReconnect = false ; }, 5000); } } export default new Ws(); |
二、引入并使用
1
2
3
4
5
6
7
8
9
10
11
12
|
import socket from '@/utils/ws' ; socket .getInstance() .then((ws) => { // 这里的 ws 就是实例化后的 websocket,可以直接使用 websocket 原生 api console.log( 'getInstance ws' , ws); ws.addEventListener( 'message' , (event) => { console.log( 'ws 接收到消息' , event); }); }) . catch (() => {}); |
以上就是记录一次websocket封装的过程的详细内容,更多关于websocket封装的资料请关注服务器之家其它相关文章!
原文链接:https://www.lmkjs.com/article/detail?id=62