記錄一次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í)傳送+簡易波形圖效果
- NodeJS多種創(chuàng)建WebSocket監(jiān)聽的方式(三種)
- Nodejs實(shí)現(xiàn)WebSocket代碼實(shí)例
- python開發(fā)實(shí)例之python使用Websocket庫開發(fā)簡單聊天工具實(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簡單實(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-05javascript 動(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-0125個(gè)讓你眼前一亮的JavaScript代碼技巧分享
學(xué)習(xí)強(qiáng)大的JavaScript一行代碼,能夠節(jié)省你的時(shí)間和代碼量,所以本文為大家整理了25個(gè)JavaScript實(shí)用代碼技巧,感興趣的小伙伴可以了解一下2023-07-07- 圖片自定義滾動(dòng)條3.0(Duma“自動(dòng)渲染版”,也許世間萬物都會(huì)變,但是真摯的愛,卻永遠(yuǎn)留存在心中?。?/div> 2009-07-07
JS字符串統(tǒng)計(jì)操作示例【遍歷,截取,輸出,計(jì)算】
這篇文章主要介紹了JS字符串統(tǒng)計(jì)操作,結(jié)合實(shí)例形式分析了javascript字符串的遍歷,截取,輸出,計(jì)算等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2017-03-03JavaScript隨機(jī)生成信用卡卡號(hào)的方法
這篇文章主要介紹了JavaScript隨機(jī)生成信用卡卡號(hào)的方法,涉及javascript操作隨機(jī)隨機(jī)數(shù)生成信用卡卡號(hào)的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04最新評(píng)論