亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

記錄一次websocket封裝的過程

 更新時(shí)間:2020年11月23日 10:54:35   作者:大明的IT筆記  
這篇文章主要介紹了記錄一次websocket封裝的過程,幫助大家更好的理解和封裝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)文章!

相關(guān)文章

  • wap瀏覽自動(dòng)跳轉(zhuǎn)到wap頁面的js代碼

    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)修改樣式和層疊樣式表代碼

    javascript 動(dòng)態(tài)修改樣式和層疊樣式表代碼,需要的朋友可以參考下。
    2010-04-04
  • JavaScript this關(guān)鍵字的深入詳解

    JavaScript this關(guān)鍵字的深入詳解

    這篇文章主要給大家介紹了關(guān)于JavaScript this關(guān)鍵字的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 在JavaScript中添加css樣式(js追加類)代碼示例

    在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
  • 如何在TypeScript中使用函數(shù)

    如何在TypeScript中使用函數(shù)

    這篇文章主要為大家介紹了如何在TypeScript中使用函數(shù)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 詳解JavaScript實(shí)現(xiàn)哈希表

    詳解JavaScript實(shí)現(xiàn)哈希表

    哈希表是一種非常重要的數(shù)據(jù)結(jié)構(gòu),幾乎所有的編程語言都有直接或者間接的應(yīng)用這種數(shù)據(jù)結(jié)構(gòu)。本文將為大家介紹通過JavaScript如何實(shí)現(xiàn)哈希表,以及哈希表的一些常用操作,需要的可以參考一下
    2021-12-12
  • 25個(gè)讓你眼前一亮的JavaScript代碼技巧分享

    25個(gè)讓你眼前一亮的JavaScript代碼技巧分享

    學(xué)習(xí)強(qiáng)大的JavaScript一行代碼,能夠節(jié)省你的時(shí)間和代碼量,所以本文為大家整理了25個(gè)JavaScript實(shí)用代碼技巧,感興趣的小伙伴可以了解一下
    2023-07-07
  • 自定義滾動(dòng)條3.0

    自定義滾動(dòng)條3.0

    圖片自定義滾動(dòng)條3.0(Duma“自動(dòng)渲染版”,也許世間萬物都會(huì)變,但是真摯的愛,卻永遠(yuǎn)留存在心中?。?/div> 2009-07-07
  • JS字符串統(tǒng)計(jì)操作示例【遍歷,截取,輸出,計(jì)算】

    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ī)生成信用卡卡號(hào)的方法,涉及javascript操作隨機(jī)隨機(jī)數(shù)生成信用卡卡號(hào)的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04

最新評(píng)論