国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

vue3使用websocket簡易封裝,包含錯誤重連機制

這篇具有很好參考價值的文章主要介紹了vue3使用websocket簡易封裝,包含錯誤重連機制。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

websocket實現(xiàn)的全雙工通信,真真太香了,以下是筆者在使用時,自己封裝的一個簡易js工具。若需要源碼,請移步這里

1 初始化連接

let socket = null; // 連接對象
let linkFailCount = 0; // 連接次數(shù),目前連接三次
let relinkLoading = null;// 重連全屏loading

/**
 * @description: 初始化websocket
 * @param {*} linkUrl url的地址
 * @return {WebSocket} WebSocket對象
 * @Author: liuxin
 */
function initWebSocket(linkUrl = "") {
    // 正在連接或連接成功
    if (socket && (socket.readyState < 2)) {
        return socket;
    }

    // 如果地址由上層傳遞過來,則使用傳遞的地址
    if (linkUrl) {
        Window.apiConfig[process.env.NODE_ENV].wsUrl = linkUrl;
    }
    const url = Window.apiConfig[process.env.NODE_ENV].wsUrl;
    socket = new WebSocket(url) // 創(chuàng)建對象
    socket.onerror = webSocketOnError; // 連接錯誤處理
    socket.onclose = closeWebsocket; // 連接關閉處理
    socket.onopen = openWebsocket; // 連接打開處理
    return socket;
}

2 連接打開回調

/**
 * @description: 打開websocket回調函數(shù)處理
 * @return {*}
 * @Author: liuxin
 */
function openWebsocket() {
    console.log("WebSocket連接打開...");
    linkFailCount = 0;// 打開連接,連接次數(shù)改為0
    // 加載動畫如果開啟,則關閉
    if (relinkLoading) {
        relinkLoading.close();
    }
}

3 連接關閉回調

/**
 * @description: 關閉websocket回調函數(shù)處理
 * @return {*}
 * @Author: liuxin
 */
function closeWebsocket() {
    // 連接關閉時,立刻開啟重連機制
    if (linkFailCount < 3 && socket && (socket.readyState >= 2)) {
        // 開啟重連加載動畫
        relinkLoading = ElLoading.service({
            lock: true,
            text: `連接關閉了,正在重連,請稍等...`,
        })
        initWebSocket();
    }
}

4 連接錯誤處理

筆者這里會重連3次,重連的過程給與用戶提示,3次之后會提示用戶手動刷新

vue3使用websocket簡易封裝,包含錯誤重連機制

vue3使用websocket簡易封裝,包含錯誤重連機制

/**
 * @description: 連接錯誤回調函數(shù)處理
 * @param {*} e 錯誤對象
 * @Author: liuxin
 */
function webSocketOnError(e) {
    linkFailCount++;// 連接失敗的次數(shù)
    if (relinkLoading) {
        relinkLoading.close(); // 關閉重連加載動畫
    }
    //連接三次
    if (linkFailCount < 3) {
        initWebSocket();
        // 開啟重連加載動畫
        relinkLoading = ElLoading.service({
            lock: true,
            text: `第${linkFailCount}次連接失敗,正在嘗試第${linkFailCount + 1}次重新連接,請稍等...`,
        })
    } else {
        ElMessageBox.confirm(
            '連接失敗,是否嘗試刷新?',
            '警告',
            {
                confirmButtonText: '刷新',
                cancelButtonText: '取消',
                type: 'warning',
                "close-on-click-modal": false
            }
        )
            .then((e) => {
                if (e == "confirm") {
                    location.reload();
                }
            })
    }
}

?5 數(shù)據(jù)處理

這里與后端約定的數(shù)據(jù)返回,加上type作為接口判斷依據(jù),因此這里不一定通用。

返回數(shù)據(jù)接口:{type:"xxx",data:{}}

/**
 * @description: 處理websocket返回的數(shù)據(jù)
 * @param {*} res 后端返回的數(shù)據(jù)
 * @return {Object<JSON>} 
 * @Author: liuxin
 */
function webscoketDealData(res, type) {
    const data = JSON.parse(res.data);
    if (data.code !== 200) {
        ElMessage.error("服務器錯誤" + data.message || "");
        return { type: "error" };
    }
    const returnData = { type: data.type, data: data.data };
    // 打印日志在前端
    // if (type && type == data.type) {
    // console.log('消息回來了-----', returnData);
    // }
    return returnData;
}

6 使用示例

      const socket = initWebSocket(state.webSocketUrl); // 連接websocket

      if (socket) {
        // 這個寫法會導致多次進入監(jiān)聽事件
        socket.addEventListener("message", (scev) => {
          console.log(scev.data);
          state.returnData.push(scev.data);
        });

        /* 監(jiān)聽socket關閉 */
        socket.addEventListener("close", () => {
          state.returnData.push("連接關閉");
        });
      }

      sendMessage("escalator_data_detail", state.params); // 發(fā)送消息給后端請求數(shù)據(jù)


以下是在上述的基礎上,為整改頁面監(jiān)聽message多次進入的問題,進行的一個優(yōu)化處理

7 優(yōu)化消息處理

7.1 消息存儲在store倉庫

import store from "@/store";

/**
 * @description: 初始化websocket
 * @param {*} link url后更上的地址
 * @return {WebSocket} WebSocket對象
 * @Author: liuxin
 */
function initWebSocket() {
    // 正在連接或連接成功
    if (socket && (socket.readyState < 2)) {
        return socket;
    }
    const url = Window.apiConfig[process.env.NODE_ENV].wsUrl;
    socket = new WebSocket(url)//這里面的this都指向vue 
    socket.onerror = webSocketOnError;
    socket.onclose = closeWebsocket;
    socket.onopen = openWebsocket;
    socket.onmessage = (res) => {
        // console.log("消息回來了-----", res.data);
        const data = JSON.parse(res.data);
        if (data.code !== 200) {
            ElMessage.error("服務器錯誤:" + data.message || "");
        }
        store.commit("commitSocketData", data); // 將消息存入倉庫中,而后使用則在倉庫取,不再監(jiān)聽message事件
    };
    return socket;
}

7.2 引入倉庫存儲

import { createStore } from 'vuex'
export default createStore({
  state: {
    // 用于存儲websocket返回的數(shù)據(jù) {后端的給定的type:后端的數(shù)據(jù)}
    socketData: {
    },
  },
  getters: {
    /**
     * @description: 獲取webscoket返回的數(shù)據(jù)
     * @return {*}
     * @Author: liuxin
     */
    getSocketDataByType: (state) => (type) => {
      if (Object.hasOwnProperty.call(state, type)) {
        return state[type].data;
      }
    }
  },
  mutations: {
    /**
     * @description: 
     * @param {*} state state對象
     * @param {*} commitData {type:"后端的api類型",data:"后端的數(shù)據(jù)"}
     * @return {*}
     * @Author: liuxin
     */
    commitSocketData(state, commitData) {
      // 如果沒有數(shù)據(jù),則直接返回
      if (!commitData || !commitData.type) {
        return;
      }
      state.socketData[commitData.type] = {}; // 初始化一個對象
      state.socketData[commitData.type].data = commitData.data; // 添加數(shù)據(jù)存儲
      state.socketData[commitData.type].timelyFlag = Date.now(); // 添加時間戳,保證每次后端的數(shù)據(jù)都能更新成功
    },
  },
})

7.3? 使用說明

直接引入store倉庫,監(jiān)聽倉庫數(shù)據(jù)變化文章來源地址http://www.zghlxwxcb.cn/news/detail-503967.html

import { useStore } from "vuex"; // 引入vuex

const store = useStore(); // 創(chuàng)建store對象


        /**
     * @description: 監(jiān)聽vuex獲取的數(shù)據(jù)變化,用于展示在前端
     * @Author: liuxin
     */
    watch(
      () => store.state.socketData["escalator_data_detail"], // 這里escalator_data_detail是后端返回的type
      (newData) => {
        dealData(newData.data); // 處理數(shù)據(jù)
      }
    );

7.4編寫一個公共發(fā)送消息方法

/**
 * @description: 發(fā)送websocket數(shù)據(jù)給后端
 * @param {String} method 方法
 * @param {JSON} params 參數(shù)
 * @return {Object<JSON>} 
 * @Author: liuxin
 */
function sendMessage(method, params) {
    const _data = {
        api: method,
        data: {
            ...params,
        }
    };

    if (socket && socket.readyState == 1) {
        // console.log("sendMessage----------", _data);
        socket.send(JSON.stringify(_data))
    } else {
        // 監(jiān)聽socket打開
        socket.addEventListener("open", () => {
            // console.log("sendMessage -----open-----", _data);
            socket.send(JSON.stringify(_data))
        });
    }
}

到了這里,關于vue3使用websocket簡易封裝,包含錯誤重連機制的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • vue3的vue-chart組件封裝(包含數(shù)據(jù)刷新按需使用)

    vue3的vue-chart組件封裝(包含數(shù)據(jù)刷新按需使用)

    v-chart封裝數(shù)據(jù)更新效果 初始數(shù)據(jù)展示: ?刷新數(shù)據(jù)展示: v-charts Description https://v-charts.js.org/#/ npm i v-charts echarts -S / yarn add v-charts echarts -S 先別急著直接定義option對象,可以參考官網(wǎng)這個方法: Documentation - Apache ECharts 也就是通過實例,調用setOption這個方法,可以不通過傳遞

    2024年02月02日
    瀏覽(27)
  • uniapp websocket 封裝斷線重連

    uniapp websocket 封裝斷線重連

    ?1.新建一個工具類js文件 2. 把我封裝的代碼復制進去 我是用uniapp 的api封裝的 在外面也可以直接用uniapp的api操作 只有在開始調用連接需要用封裝的方法調用 在需要使用封裝的方法的頁面?引入js ?? ?import { ?? ??? ?websocetObj ?? ?} from \\\"@/API/websocket.js\\\" ?完善重連 在app.vue的

    2024年02月11日
    瀏覽(17)
  • websocket前端封裝代碼,心跳機制斷線重連

    websocket前端封裝代碼,心跳機制斷線重連

    websocket是一種全雙工通信長鏈接,大多用來實現(xiàn)及時通訊,數(shù)據(jù)實時性要求較為高的地方,在websoket未出現(xiàn)的時候前端使用的setInterval輪訓進行數(shù)據(jù)更新的,在那些對于數(shù)據(jù)實時性要求不高地方我們仍可以使用 輪訓。 (1)建立在 TCP 協(xié)議之上,服務器端的實現(xiàn)比較容易。 (

    2024年02月11日
    瀏覽(32)
  • Flutter:WebSocket封裝-實現(xiàn)心跳、重連機制

    前言Permalink Flutter簡介 Flutter 是 Google推出并開源的移動應用開發(fā)框架,主打跨平臺、高保真、高性能。開發(fā)者可以通過 Dart語言開發(fā) App,一套代碼同時運行在 iOS 和 Android平臺。 Flutter提供了豐富的組件、接口,開發(fā)者可以很快地為 Flutter添加 native擴展。同時 Flutter還使用 Nat

    2024年02月10日
    瀏覽(34)
  • 基于Vue3封裝一個好用的Websocket

    在Vue3中使用Websocket可以讓我們輕松地實現(xiàn)實時數(shù)據(jù)傳輸。為了方便使用,我們可以封裝一個好用的Websocket類。 首先我們需要安裝 ws 庫來處理Websocket連接,使用以下命令進行安裝: 我們可以新建一個 websocket.js 文件,在其中定義一個 Websocket 類,代碼如下: 以上代碼中,我們

    2024年02月04日
    瀏覽(19)
  • Vue3封裝全局WebSocket;全局可監(jiān)聽、可發(fā)送、心跳處理等;

    操作如下 可以在多個頁面多個組件中進行監(jiān)聽/發(fā)送 代碼簡介 方便; 首先安裝 tools-javascript 以及 tools-vue3 根據(jù)你的業(yè)務需求初始化 ws 在你的任何文件中直接調用即可 附加篇(也可不讀 直接看文檔 )

    2024年02月11日
    瀏覽(20)
  • vue3 codemirror關于 sql 和 json格式化的使用以及深入了解codemirror 使用json格式化提示錯誤的關鍵代碼。包含了json格式化沒有效果和json格式化提示錯誤

    vue3 codemirror關于 sql 和 json格式化的使用以及深入了解codemirror 使用json格式化提示錯誤的關鍵代碼。包含了json格式化沒有效果和json格式化提示錯誤

    后端返回一個json字符串,里面有value1、value2指定字段渲染sql語句,其他渲染json語句。 jsonlint 和 jsonlint-mod 的區(qū)別 簡單理解:jsonlint校驗json格式化是否有效,jsonlint-mod用來格式化后同時校驗json格式化是否有效。 (1)JSONLint是一種可以驗證JSON格式是否有效的工具。 它可以檢查

    2024年04月28日
    瀏覽(93)
  • vue封裝和使用websocket

    最近做了一個數(shù)據(jù)大屏的項目,使用了websocket來實現(xiàn)數(shù)據(jù)實時更新的需求,簡單記錄分享一下。 1、WebSocket協(xié)議是基于TCP的一種新的網(wǎng)絡協(xié)議,允許服務端主動向客戶端推送數(shù)據(jù),實現(xiàn)全雙工通信。 2、在WebSocket API中,瀏覽器和服務器只需要完成一次握手,兩者之間就直接可

    2024年02月06日
    瀏覽(14)
  • Vue+Nodejs 使用WebSocket創(chuàng)建一個簡易聊天室

    Vue+Nodejs 使用WebSocket創(chuàng)建一個簡易聊天室

    使用vue編寫前端頁面,nodejs處理服務端消息,WebSocket進行實時通信 1.客戶端 2. 服務端 使用的是nodejs

    2024年02月16日
    瀏覽(25)
  • Vue3 報 WebSocket connection to ‘ws://x.x.x.x:8080/ws‘ failed 的錯誤

    Vue3 報 WebSocket connection to ‘ws://x.x.x.x:8080/ws‘ failed 的錯誤

    問題:控制臺每過幾秒就報WebSocket的錯誤,但是頁面顯示正常。 原因:WebSocket是一種雙向通信的協(xié)議,它在嘗試建立到 \\\'ws://x.x.x.x:8080/ws\\\' 的通信失敗。原因可能是服務器 \\\'x.x.x.x\\\' 不可用,或WebSocket服務未正確配置。因此,我們去配置一下通信問題。 解決: 整體代碼: 重點:修

    2024年02月04日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包