記錄一次websocket封裝的過程
在一個(gè)應(yīng)用中,websocket一般都是以單例形式存在的,即在整個(gè)應(yīng)用中,websocket實(shí)例始終保持唯一。但有時(shí)我們要用到websocket實(shí)例的時(shí)候,可能websocket還沒實(shí)例化,所以要做成異步的形式來獲取實(shí)例。
一、封裝。先創(chuàng)建 socket.ts 文件
import EventEmitter from 'events'; // 這里用到了 events 包
const ee = new EventEmitter();
class Ws {
private wsUrl: string = '';
private socket: WebSocket | undefined; // socket實(shí)例
private lockReconnect: boolean = false; // 重連鎖
private timeout: NodeJS.Timeout | undefined;
// 初始化socket,一般在應(yīng)用啟動(dòng)時(shí)初始化一次就好了,或者需要更換wsUrl
public init(wsUrl: string) {
this.wsUrl = wsUrl;
this.createWebSocket();
}
// 獲取socket實(shí)例
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();
}
});
}
});
}
// 創(chuàng)建socket
private createWebSocket() {
try {
console.log('websocket 開始鏈接');
const socket = new WebSocket(this.wsUrl);
socket.addEventListener('close', () => {
console.log('websocket 鏈接關(guān)閉');
this.socket = undefined;
this.reconnect();
});
socket.addEventListener('error', () => {
console.log('websocket 發(fā)生異常了');
this.socket = undefined;
this.reconnect();
});
socket.addEventListener('open', () => {
// 可在此進(jìn)行心跳檢測(cè)
// 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;
//沒連接上會(huì)一直重連,設(shè)置延遲避免請(qǐng)求過多
this.timeout && clearTimeout(this.timeout);
this.timeout = setTimeout(() => {
this.createWebSocket();
this.lockReconnect = false;
}, 5000);
}
}
export default new Ws();
二、引入并使用
import socket from '@/utils/ws';
socket
.getInstance()
.then((ws) => {
// 這里的 ws 就是實(shí)例化后的 websocket,可以直接使用 websocket 原生 api
console.log('getInstance ws', ws);
ws.addEventListener('message', (event) => {
console.log('ws 接收到消息', event);
});
})
.catch(() => {});
以上就是記錄一次websocket封裝的過程的詳細(xì)內(nèi)容,更多關(guān)于websocket封裝的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 讓ie6也支持websocket采用flash封裝實(shí)現(xiàn)
- Vue +WebSocket + WaveSurferJS 實(shí)現(xiàn)H5聊天對(duì)話交互的實(shí)例
- js實(shí)現(xiàn)mp3錄音通過websocket實(shí)時(shí)傳送+簡(jiǎn)易波形圖效果
- NodeJS多種創(chuàng)建WebSocket監(jiān)聽的方式(三種)
- Nodejs實(shí)現(xiàn)WebSocket代碼實(shí)例
- python開發(fā)實(shí)例之python使用Websocket庫開發(fā)簡(jiǎn)單聊天工具實(shí)例詳解(python+Websocket+JS)
- node.js ws模塊搭建websocket服務(wù)端的方法示例
- nodejs 使用nodejs-websocket模塊實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)實(shí)時(shí)通訊
- 在vue中使用SockJS實(shí)現(xiàn)webSocket通信的過程
- NodeJS簡(jiǎn)單實(shí)現(xiàn)WebSocket功能示例
- nodejs基于WS模塊實(shí)現(xiàn)WebSocket聊天功能的方法
相關(guān)文章
wap瀏覽自動(dòng)跳轉(zhuǎn)到wap頁面的js代碼
這篇文章主要介紹了如何讓用戶輸入wap手機(jī)網(wǎng)站的網(wǎng)址時(shí)自動(dòng)跳轉(zhuǎn)到wap網(wǎng)站,需要的朋友可以參考下2014-05-05
javascript 動(dòng)態(tài)修改樣式和層疊樣式表代碼
javascript 動(dòng)態(tài)修改樣式和層疊樣式表代碼,需要的朋友可以參考下。2010-04-04
在JavaScript中添加css樣式(js追加類)代碼示例
這篇文章主要給大家介紹了關(guān)于在JavaScript中如何添加css樣式,也就是js追加類的相關(guān)資料,JavaScript是一種廣泛應(yīng)用于互聯(lián)網(wǎng)開發(fā)的編程語言,它能夠幫助網(wǎng)頁實(shí)現(xiàn)動(dòng)態(tài)效果和交互性,需要的朋友可以參考下2024-01-01
25個(gè)讓你眼前一亮的JavaScript代碼技巧分享
學(xué)習(xí)強(qiáng)大的JavaScript一行代碼,能夠節(jié)省你的時(shí)間和代碼量,所以本文為大家整理了25個(gè)JavaScript實(shí)用代碼技巧,感興趣的小伙伴可以了解一下2023-07-07
JS字符串統(tǒng)計(jì)操作示例【遍歷,截取,輸出,計(jì)算】
這篇文章主要介紹了JS字符串統(tǒng)計(jì)操作,結(jié)合實(shí)例形式分析了javascript字符串的遍歷,截取,輸出,計(jì)算等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2017-03-03
JavaScript隨機(jī)生成信用卡卡號(hào)的方法
這篇文章主要介紹了JavaScript隨機(jī)生成信用卡卡號(hào)的方法,涉及javascript操作隨機(jī)隨機(jī)數(shù)生成信用卡卡號(hào)的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04

