最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文詳解websocket在vue2中的封裝使用

 更新時間:2023年03月08日 11:45:29   作者:梓恒  
這篇文章主要為大家介紹了一文詳解websocket在vue2中的封裝使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

websocket在vue2中的封裝使用

先說需求: 頁面中有websocket連接,進入的時候發(fā)送參數(shù)到后端,后端發(fā)送消息, 離開頁面時發(fā)送參數(shù)至后端,后端停止發(fā)送消息,不得斷開連接, 下一次進入時頁面時不用再次連接。

實現(xiàn)思路:

  • 因為是全局連接一個websocket,所以這里采用單例模式
  • 也是因為封裝的原因,頁面中肯定是直接拿不到onmessage中返回的數(shù)據(jù), 所以這里采用發(fā)布訂閱模式來做

完整代碼在最后,不想看我廢話的可以直接扒拉了

步驟

步驟就是: 連接,頁面發(fā)送消息,接收消息,over ~

首先定義連接websocket的方法

 export default class SocketService {
     constructor(url){
         this.url = url
     },
     connect() {
         //判斷瀏覽器是否支持websocket
         if (!window.WebSocket) {
           return console.log("您的瀏覽器不支持WebSocket");
         }
         url,
        //連接websocket
         this.ws = new WebSocket(this.url);
         //監(jiān)聽websocket各種狀態(tài)
         this.ws.onopen = () => {};
         this.ws.onclose = () => {};
         this.ws.onerror = () => {};
         this.ws.onmessage = (e) => {};
     }
 }

我們先讓socket連接上叭

 export default class SocketService {
     constructor(url, againConnect = true){
         this.url = url
         this.againConnect = againConnect;
     },
       ws = null;         // 和服務(wù)端連接的socket對象
       url;               //地址
       againConnect;      //標識斷開是否重連
       connected = false; // 標識是否連接成功
       sendRetryCount = 0; // 記錄重試的次數(shù)
       connectRetryCount = 0; // 重新連接嘗試的次數(shù)
     connect() {
         //判斷瀏覽器是否支持websocket
         if (!window.WebSocket) {
           return console.log("您的瀏覽器不支持WebSocket");
         }
         url,
        //連接websocket
         this.ws = new WebSocket(this.url);
         //監(jiān)聽websocket各種狀態(tài)
         this.ws.onopen = () => {
             //連接上后所有標識清零
             this.connected = true;
             this.connectRetryCount = 0;
         };
         this.ws.onclose = () => {
             //連接關(guān)閉
             this.connected = false;
             this.connectRetryCount++;
             if (this.againConnect) {
                 //重連
                 setTimeout(() => {
                   this.connect();
                 }, 500 * this.connectRetryCount);
               } else {
                 //不重連的操作
                  sessionStorage.clear();
                  localStorage.clear();
                  message.error("登錄超時");
                  router.push("/");
               }
         };
         this.ws.onerror = () => {
             //連接失敗
               this.connected = false;
               this.connectRetryCount++;
               if (this.againConnect) {
                 setTimeout(() => {
                   this.connect();
                 }, 500 * this.connectRetryCount);
               }
         };
         this.ws.onmessage = (e) => {
             console.log(e)
         };
     },
     unSubscribe() {}
     send(){
         //發(fā)送消息的方法
     }
 }

那么我們要怎么給后端發(fā)送消息呢,發(fā)送了消息之后我們又該怎樣才能在頁面中接收到消息呢?

在send方法中接收一個回調(diào)函數(shù),

在message中調(diào)用,

 subscribeList = {}; //記載回調(diào)函數(shù)
 idList = [];
 send(data, callback) {
     //判斷此時有沒有ws
     if (!this.ws) {
       this.connect();
       this.send(data, callback);
     } else {
       // 判斷此時此刻有沒有連接成功
       if (this.connected) {
         this.sendRetryCount = 0;
         this.ws.send(JSON.stringify(data));
         if (data.type === "sub") {
           //存儲id
           this.idList.push(data.id);
           //存儲回調(diào)函數(shù),
           if (!this.subscribeList[data.id]) {
             this.subscribeList[data.id] = [callback];
           } else {
             this.subscribeList[data.id].push(callback);
           }
         }
       } else {
         this.sendRetryCount++;
         setTimeout(() => {
           this.send(data, callback);
         }, this.sendRetryCount * 500);
       }
     }
   }
 connect(){
     ......
     this.ws.onmessage = (e) => {
       let { payload, requestId, type } = JSON.parse(e.data);
       if (type === "error") {
         console.log("出錯了");
       }
       if (this.subscribeList[requestId]) {
         if (type === "complete") {
           console.log("完成了");
         } else if (type === "result") {
           this.subscribeList[requestId].forEach((item) =>
             item.call(this, payload)
           );
         }
       }
     };
 }
 //銷毀回調(diào)函數(shù)
   unSubscribe() {
     //停止消息發(fā)送
     this.idList.forEach((item) => {
       this.send({ id: item, type: "unsub" });
       delete this.subscribeList[item];
     });
     this.idList = [];
  }
  • sub標識發(fā)送消息, unsub標識停止發(fā)送消息
  • id為事件的標識符

現(xiàn)在解決了頁面中接收消息的問題,那么怎么保證離開頁面,回到頁面,使用的是同一個websocket呢,如果實例化這個類的話,那么每次進入都會實例化SocketService,

es6的class中有取值函數(shù)和存值函數(shù), 具體使用請看這里:

Class 的基本語法 - ES6 教程 - 網(wǎng)道 (wangdoc.com)

 instance = null;
 static get Instance() {
     if (!this.instance) {
       this.instance = new SocketService(false);
     }
     return this.instance;
  }
  • 使用getter,來拿取class中的instance,拿取的時候設(shè)置攔截該行為,判斷instance有沒有值,沒有值就實例化SocketService給instance,返回instance,

頁面中使用方式

 import SocketService from "@/websocket/websocket";
 mounted() {
     this.ws = SocketService.Instance;
     this.ws.send(
       {
         id: "11111",
         topic: "/xxx/xxx",
         parameter: {},
         type: "sub",
       },
       this.Callback
     );
 }
 destroyed() {
     this.ws.unSubscribe();
 },
 methods:{
     Callback(data) {
           console.log(data);
     },
 }

看到這里了,不妨給個小心心叭

在vue中的封裝

 export default class SocketService {
   constructor(againConnect = true, url) {
     this.url = url;
     this.againConnect = againConnect;
   }
   instance = null;  //頁面中使用的SocketService實例
   ws = null; // 和服務(wù)端連接的socket對象
   url; //地址
   againConnect;     //斷開是否重連
   connected = false; // 標識是否連接成功
   sendRetryCount = 0; // 記錄重試的次數(shù)
   connectRetryCount = 0; // 重新連接嘗試的次數(shù)
   //單例模式保證只有一個SocketService實例
   static get Instance() {
     if (!this.instance) {
         this.url = '......'
       this.instance = new SocketService(false, url);
     }
     return this.instance;
   }
   //  定義連接服務(wù)器的方法
   connect() {
     // 這里判斷你的瀏覽器支不支持websocket
     if (!window.WebSocket) {
       return console.log("您的瀏覽器不支持WebSocket");
     }
     this.ws = new WebSocket(this.url);
     //連接上了
     this.ws.onopen = () => {
       this.connected = true;
       // 重置重新連接的次數(shù)
       this.connectRetryCount = 0;
     };
       //連接關(guān)閉了,設(shè)置標識值為false,
     this.ws.onclose = () => {
       this.connected = false;
       this.connectRetryCount++;
       if (this.againConnect) {
         setTimeout(() => {
           this.connect();
         }, 500 * this.connectRetryCount);
       } else {
         sessionStorage.clear();
         localStorage.clear();
         message.error("登錄超時");
         router.push("/");
       }
     };
     this.ws.onerror = () => {
       console.log("socket連接失敗");
       this.connected = false;
       this.connectRetryCount++;
       if (this.againConnect) {
         setTimeout(() => {
           this.connect();
         }, 500 * this.connectRetryCount);
       }
     };
     this.ws.onmessage = (e) => {
       let { payload, requestId } = JSON.parse(e.data);
       if (this.subscribeList[requestId]) {
           this.subscribeList[requestId].forEach((item) =>
             item.call(this, payload)
           );
         }
     };
   }
   //銷毀回調(diào)函數(shù)
   unSubscribe() {
     //停止消息發(fā)送
     this.idList.forEach((item) => {
       this.send({ id: item, type: "unsub" });
       delete this.subscribeList[item];
     });
     this.idList = [];
   }
   subscribeList = {}; //記載回調(diào)函數(shù)
   idList = [];
   // 發(fā)送數(shù)據(jù)的方法
   send(data, callback) {
     //判斷此時有沒有ws
     if (!this.ws) {
       this.connect();
       this.send(data, callback);
     } else {
       // 判斷此時此刻有沒有連接成功
       if (this.connected) {
         this.sendRetryCount = 0;
         this.ws.send(JSON.stringify(data));
         if (data.type === "sub") {
           //存儲id
           this.idList.push(data.id);
           //存儲回調(diào)函數(shù),
           if (!this.subscribeList[data.id]) {
             this.subscribeList[data.id] = [callback];
           } else {
             this.subscribeList[data.id].push(callback);
           }
         }
       } else {
         this.sendRetryCount++;
         setTimeout(() => {
           this.send(data, callback);
         }, this.sendRetryCount * 500);
       }
     }
   }
 }

以上就是一文詳解websocket在vue2中的封裝使用的詳細內(nèi)容,更多關(guān)于vue2封裝websocket的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue配置font-awesome5的方法步驟

    vue配置font-awesome5的方法步驟

    這篇文章主要介紹了vue配置font-awesome5的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • vue+element-ui+axios多文件上傳的實現(xiàn)并顯示整體進度

    vue+element-ui+axios多文件上傳的實現(xiàn)并顯示整體進度

    這篇文章主要介紹了vue+element-ui+axios多文件上傳的實現(xiàn)并顯示整體進度,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 詳解Nuxt.js Vue服務(wù)端渲染摸索

    詳解Nuxt.js Vue服務(wù)端渲染摸索

    本篇文章主要介紹了詳解Nuxt.js Vue服務(wù)端渲染摸索,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • 在vue-cli3中使用axios獲取本地json操作

    在vue-cli3中使用axios獲取本地json操作

    這篇文章主要介紹了在vue-cli3中使用axios獲取本地json操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Vue拖拽組件開發(fā)實例詳解

    Vue拖拽組件開發(fā)實例詳解

    本文重點給大家介紹Vue拖拽組件開發(fā)實例,拖拽的原理是手指在移動的過程中,實時改變元素的位置即top和left值,使元素隨著手指的移動而移動。對實例代碼感興趣的朋友跟隨腳本之家小編一起學(xué)習吧
    2018-05-05
  • 前端虛擬滾動列表實現(xiàn)代碼(vue虛擬列表)

    前端虛擬滾動列表實現(xiàn)代碼(vue虛擬列表)

    前端的性能瓶頸那就是頁面的卡頓,當然這種頁面的卡頓包含了多種原因,下面這篇文章主要給大家介紹了關(guān)于前端虛擬滾動列表實現(xiàn)的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-06-06
  • element中Steps步驟條和Tabs標簽頁關(guān)聯(lián)的解決

    element中Steps步驟條和Tabs標簽頁關(guān)聯(lián)的解決

    這篇文章主要介紹了element中Steps步驟條和Tabs標簽頁關(guān)聯(lián)的解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2020-12-12
  • vue使用高德地圖實現(xiàn)添加點標記和獲取點擊位置信息的示例代碼

    vue使用高德地圖實現(xiàn)添加點標記和獲取點擊位置信息的示例代碼

    這篇文章主要介紹了vue使用高德地圖實現(xiàn)添加點標記和獲取點擊位置信息的示例代碼,文中補充介紹了高德vue-amap使用(一)標記點位獲取地址及經(jīng)緯度,本文結(jié)合示例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2024-01-01
  • vue項目發(fā)布有緩存正式環(huán)境不更新的解決方案

    vue項目發(fā)布有緩存正式環(huán)境不更新的解決方案

    vue項目每次發(fā)布新版本后,測試人員都要強制刷新才能更新瀏覽器代碼來驗證bug,下面這篇文章主要給大家介紹了關(guān)于vue項目發(fā)布有緩存正式環(huán)境不更新的解決方案,需要的朋友可以參考下
    2024-03-03
  • 在Vue中使用動態(tài)import()語法動態(tài)加載組件

    在Vue中使用動態(tài)import()語法動態(tài)加載組件

    在Vue中,你可以使用動態(tài)import()語法來動態(tài)加載組件,動態(tài)導(dǎo)入允許你在需要時異步加載組件,這樣可以提高應(yīng)用程序的初始加載性能,本文給大家介紹在Vue中使用動態(tài)import()語法動態(tài)加載組件,感興趣的朋友一起看看吧
    2023-11-11

最新評論

富蕴县| 凭祥市| 阿拉善盟| 绩溪县| 托里县| 建宁县| 通山县| 改则县| 镇巴县| 霍山县| 婺源县| 青海省| 嘉义市| 仙游县| 德庆县| 蒲城县| 收藏| 都兰县| 巴林左旗| 屏东市| 安康市| 连城县| 辽宁省| 水城县| 东港市| 新晃| 清涧县| 临湘市| 南皮县| 蒙阴县| 库车县| 英吉沙县| 东台市| 剑阁县| 宜丰县| 伊吾县| 宝丰县| 新巴尔虎左旗| 桐乡市| 焦作市| 阳信县|