Vue通過WebSocket建立長連接的實(shí)現(xiàn)代碼
使用場景:
在項(xiàng)目開發(fā)中,后端需要處理一連串的邏輯,或者等待第三方的數(shù)據(jù)返回來進(jìn)行處理之后在返回給前端,可能時(shí)間會很長,而且前端也不知道后端什么時(shí)候能處理好(時(shí)間長的話會達(dá)到10分鐘左右),如果采用普通的HTTP連接,前后端無法一直保持聯(lián)系,麻煩的時(shí)候可能還需要采用輪詢的機(jī)制,所以使用WebSocket連接效果還是比較好的。
使用時(shí)間:
在界面加載完之后,建上WebSocket連接,此時(shí)前端還可以發(fā)送普通的HTTP的請求,等到后端處理完之后,通過建立的WebSocket連接返給前端,前端根據(jù)返回的數(shù)據(jù)進(jìn)行對應(yīng)的操作。
代碼展示:
<template> </template> <script> export default { data() { return{ // 用戶Id userId:'', appid:'', // 事件類型 type:'', msg:'', wsUrl:'' } }, methods: { //初始化weosocket initWebSocket() { if (typeof WebSocket === "undefined") { alert("您的瀏覽器不支持WebSocket"); return false; } const wsuri = 'ws://(后端WebSocket地址)/websocket/' + this.userId + '/' + this.appid // websocket地址 this.websock = new WebSocket(wsuri); this.websock.onopen = this.websocketonopen; this.websock.onmessage = this.websocketonmessage; this.websock.onerror = this.websocketonerror; this.websock.onclose = this.websocketclose; }, //連接成功 websocketonopen() { console.log("WebSocket連接成功"); // 添加心跳檢測,每30秒發(fā)一次數(shù)據(jù),防止連接斷開(這跟服務(wù)器的設(shè)置有關(guān),如果服務(wù)器沒有設(shè)置每隔多長時(shí)間不發(fā)消息斷開,可以不進(jìn)行心跳設(shè)置) let self = this; this.timer = setInterval(() => { try { self.websock.send('test') console.log('發(fā)送消息'); }catch(err){ console.log('斷開了:' + err); self.connection() } }, 30000) }, //接收后端返回的數(shù)據(jù),可以根據(jù)需要進(jìn)行處理 websocketonmessage(e) { var vm = this; let data1Json = JSON.parse(e.data); console.log(data1Json); }, //連接建立失敗重連 websocketonerror(e) { console.log(`連接失敗的信息:`, e); this.initWebSocket(); // 連接失敗后嘗試重新連接 }, //關(guān)閉連接 websocketclose(e) { console.log("斷開連接", e); } }, created() { if (this.websock) { this.websock.close(); // 關(guān)閉websocket連接 } this.initWebSocket(); }, destroyed() { //頁面銷毀時(shí)關(guān)閉ws連接 if (this.websock) { this.websock.close(); // 關(guān)閉websocket } } }; </script>
問題回顧:
在實(shí)際使用的時(shí)候遇到的問題:有的時(shí)候頁面鏈接還沒有建立上,但是后端已經(jīng)把數(shù)據(jù)都處理好了,這個(gè)時(shí)候推給前端,前端接收不到。
解決方案:
1)簡單的方法:讓后端延遲幾秒再推
優(yōu)勢:簡單
劣勢:降低了性能
2)優(yōu)化之后的方法:使用Redis保存用戶的登錄狀態(tài),緩存這個(gè)用戶的數(shù)據(jù),等到建立連接之后再推,推完就清空Redis
總結(jié)
以上所述是小編給大家介紹的Vue通過WebSocket建立長連接的實(shí)現(xiàn)代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
vue使用Highcharts實(shí)現(xiàn)不同高度的3D環(huán)形圖
這篇文章主要為大家詳細(xì)介紹了vue使用Highcharts實(shí)現(xiàn)不同高度的3D環(huán)形圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03html-webpack-plugin修改頁面的title的方法
這篇文章主要介紹了html-webpack-plugin修改頁面的title的方法 ,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06vue項(xiàng)目在線上服務(wù)器訪問失敗原因分析
這篇文章主要介紹了vue項(xiàng)目在線上服務(wù)器訪問失敗原因分析,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08如何使用 Vue Router 的 meta 屬性實(shí)現(xiàn)多種功能
在Vue.js中,Vue Router 提供了強(qiáng)大的路由管理功能,通過meta屬性,我們可以在路由定義中添加自定義元數(shù)據(jù),以實(shí)現(xiàn)訪問控制、頁面標(biāo)題設(shè)置、角色權(quán)限管理、頁面過渡效果,本文將總結(jié)如何使用 meta 屬性來實(shí)現(xiàn)這些常見的功能,感興趣的朋友一起看看吧2024-06-06新版vue-cli模板下本地開發(fā)環(huán)境使用node服務(wù)器跨域的方法
這篇文章主要介紹了新版vue-cli模板下本地開發(fā)環(huán)境使用node服務(wù)器跨域的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04vue 實(shí)現(xiàn)click同時(shí)傳入事件對象和自定義參數(shù)
這篇文章主要介紹了vue 實(shí)現(xiàn)click同時(shí)傳入事件對象和自定義參數(shù),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01