uniapp封裝websocket文件(app、h5兼容)

適合場景:只需要發送一次數據,服務器可以實時返回數據進行渲染。
socket文件

let isSocketClose = false; // 是否關閉socket
let reconnectCount = 5; // 重連次數
// let heartbeatInterval = ""; // 心跳定時器
let socketTask = null; // websocket對象let againTimer = null; //斷線重連定時器let url = null;
let onReFn = null;
let onSucFn = null;
let onErrFn = null;/*** sockeUrl:websocet的地址* onReceive:消息監聽的回調* onErrorEvent:拋出錯誤的回調,且彈窗連接失敗的提示框* onErrorSucceed:拋出成功回調,主要用于隱藏連接失敗的提示框* */
const sokcet = (sockeUrl, onReceive, onErrorEvent, onErrorSucceed) => {url = sockeUrl;onReFn = onReceive;onErrFn = onErrorEvent;onSucFn = onErrorSucceed;isSocketClose = false;//判斷是否有websocet對象,有的話清空if (socketTask) {console.log('清空ws');socketTask.close();socketTask = null;// clearInterval(heartbeatInterval);}//WebSocket的地址// 【非常重要】必須確保你的服務器是成功的,如果是手機測試千萬別使用ws://127.0.0.1:9099【特別容易犯的錯誤】let url = sockeUrl// 連接socketTask = uni.connectSocket({url: url,success(data) {console.log('清空ws重連定時器');clearInterval(againTimer) //斷線重連定時器console.log("連接成功!");},fail: (err) => {console.log(url)console.log("報錯", err);}});// 連接打開socketTask.onOpen((res) => {console.log('WebSocket打開');uni.showToast({title: 'loading...',icon: 'none',})clearInterval(againTimer) //斷線重連定時器onErrorSucceed({isShow: false}) // 用于提示框的隱藏// heartbeatInterval && clearInterval(heartbeatInterval);// 10秒發送一次心跳// heartbeatInterval = setInterval(() => {// 	sendMsg('心跳ing')// }, 1000 * 5)})// 監聽連接失敗socketTask.onError((err) => {console.log('WebSocket連接打開失敗,請檢查', err);//停止發送心跳// clearInterval(heartbeatInterval)//如果不是人為關閉的話,進行重連if (!isSocketClose) {reconnect(url, onErrorEvent)}})// // 監聽連接關閉 -socketTask.onClose((e) => {console.log('WebSocket連接關閉!');// clearInterval(heartbeatInterval)console.log(isSocketClose, 123);if (!isSocketClose) {reconnect(url, onErrorEvent)}})// 監聽收到信息socketTask.onMessage((res) => {uni.hideLoading()// console.log(res, 'res監聽收到信息')let serverData = res.data//與后端規定好返回值分別代表什么,寫業務邏輯serverData && onReceive(serverData);});
}const reconnect = (url, onErrorEvent) => {console.log('進入斷線重連1', isSocketClose);clearInterval(againTimer) //斷線重連定時器// clearInterval(heartbeatInterval);socketTask && socketTask.close(); // 確保已經關閉后再重新打開console.log('進入斷線重連2', isSocketClose);socketTask = null;onErrorEvent({isShow: true,messge: '掃描頭服務正在連接...'})uni.showToast({title: 'loading...',icon: 'none',})// 連接  重新調用創建websocet方法againTimer = setInterval(() => {sokcet(url, onReFn, onErrFn, onSucFn)console.log('在重新連接中...');}, 1000)}const sendMsg = (msg) => { //向后端發送命令msg = JSON.stringify(msg)try {//通過 WebSocket 連接發送數據socketTask.send({data: msg});} catch (e) {console.log(e, "sendMsg Error");if (isSocketClose) {return} else {reconnect(url, onErrFn)}}
}
// 關閉websocket【必須在實例銷毀之前關閉,否則會是underfined錯誤】beforeDestroy() {websocetObj.stop();}const stop = () => {console.log("關閉定時器1");isSocketClose = true// clearInterval(heartbeatInterval);clearInterval(againTimer) //斷線重連定時器socketTask.close(); // 確保已經關閉后再重新打開socketTask = null;console.log("關閉定時器2", socketTask);
}const $debounce = function(fn, wait) {let timer = null;return function() {if (timer !== null) {clearTimeout(timer);}timer = setTimeout(fn, wait);}
}export const websocetObj = {sokcet,stop,sendMsg
};

頁面中使用

	<script>import {websocetObj} from '@/common/websocket.js';export default {methods:{//websocet函數回調:返回監聽的數據getWebsocetData(val) {this.bids = JSON.parse(val).data.tick.bidsthis.asks = JSON.parse(val).data.tick.asks},//websocet函數拋錯: 返回錯誤信息 用于用戶提示getWebsocetError(err) {this.socketShow = err.isShow;this.webtext = err.messge;console.log('websocet函數拋錯', this.socketShow);},//websocet函數成功進入: 監聽連接狀態,在失敗的時候彈窗提示,具體需求看自身情況onErrorSucceed(val) {this.socketShow = val.isShow;websocetObj.sendMsg({"api": "market_depth","symbol": this.currencyShortParam})},websocket() {websocetObj.sokcet('ws://18.166.64.181:2346', this.getWebsocetData, this.getWebsocetError, this.onErrorSucceed) //請求地址},stopSocket() {websocetObj.stop()}},onShow() {this.websocket()},onHide() {this.stopSocket()},}</script>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208620.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208620.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208620.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uniapp實戰 —— 開發微信小程序的調試技巧

手機真機調試微信小程序 開發版和體驗版的小程序&#xff0c;域名沒有備案時想調試接口訪問效果&#xff0c;可以按下述方式操作&#xff1a; 在手機上點右上方三個點&#xff0c;點擊“開發調試”&#xff0c;開啟調試模式&#xff0c;即可真機訪問接口&#xff08;跳過域名校…

《C++新經典設計模式》之第21章 解釋器模式

《C新經典設計模式》之第21章 解釋器模式 解釋器模式.cpp 解釋器模式.cpp #include <iostream> #include <map> #include <stack> #include <vector> #include <cstring> #include <memory> #include <set> #include <sstream&g…

【Vue3從入門到項目實現】RuoYi-Vue3若依框架前端學習——動態路由與菜單欄

菜單欄 若依框架的側邊欄組件通常由菜單項和子菜單組成。 登錄后&#xff0c;會獲取用戶擁有的路由菜單 {"msg": "操作成功","code": 200,"data": [{"name": "System","path": "/system",…

第一百九十六回 通過藍牙發送數據的細節

文章目錄 1. 概念介紹2. 實現方法3. 代碼與效果3.1 示例代碼3.2 運行效果4. 經驗總結我們在上一章回中介紹了"分享三個使用TextField的細節"沉浸式狀態樣相關的內容,本章回中將介紹SliverList組件.閑話休提,讓我們一起Talk Flutter吧。 1. 概念介紹 通過藍牙設備…

[原創]C++98升級到C++20的復習旅途-個人感覺std::string_literals這個東西實現的不太人性化.

[簡介] 常用網名: 豬頭三 出生日期: 1981.XX.XX QQ聯系: 643439947 個人網站: 80x86匯編小站 https://www.x86asm.org 編程生涯: 2001年~至今[共22年] 職業生涯: 20年 開發語言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 開發工具: Visual Studio、D…

git操作:使用vscode集成

git操作方式 其實git操作一般有三種方式 分別是終端命令行,開發工具集成,專業的git可視化工具 我前面幾章說的都是git的命令行操作,今天這篇文章主要是針對開發工具vscode集成git操作進行演示 說明一下,這里之所以選擇vscode,是因為本人用的就是vscode,每個開發工具基本都有…

最新PyTorch機器學習與深度學習實踐技術應用

近年來&#xff0c;隨著AlphaGo、無人駕駛汽車、醫學影像智慧輔助診療、ImageNet競賽等熱點事件的發生&#xff0c;人工智能迎來了新一輪的發展浪潮。尤其是深度學習技術&#xff0c;在許多行業都取得了顛覆性的成果。另外&#xff0c;近年來&#xff0c;Pytorch深度學習框架受…

mysql怎么優化查詢?

從多個維度優化&#xff0c;這里的優化維度有四個&#xff1a;硬件配置、參數配置、表結構設計和SQL語句及索引。 其中 SQL 語句相關的優化手段是最為重要的。 一、硬件配置 硬件方面的優化可以有 對磁盤進行擴容、將機械硬盤換為SSD&#xff0c;或是把CPU的核數往上提升一些…

IDEA中,Archetype的作用

在IntelliJ IDEA中&#xff0c;Archetype&#xff08;原型&#xff09;是一種用于創建項目的模板&#xff0c;它定義了項目的基本結構和初始文件。Archetype允許您通過預先構建好的項目框架來快速創建項目&#xff0c;從而節省了手動創建項目所需的時間和精力。 使用Archetype…

spark鏈接hive時踩的坑

使用spark操作hive&#xff0c;使用metastore連接hive&#xff0c;獲取hive的數據庫時&#xff0c;當我們在spark中創建數據庫的時候&#xff0c;創建成功。 同時hive中也可以看到這個數據庫&#xff0c;建表插入數據也沒有問題&#xff0c;但是當我們去查詢數據庫中的數據時&a…

IDEA 出現問題:Idea-操作多次commit,如何合并為一個并push解決方案

??作者主頁&#xff1a;小虛竹 ??作者簡介&#xff1a;大家好,我是小虛竹。2022年度博客之星評選TOP 10&#x1f3c6;&#xff0c;Java領域優質創作者&#x1f3c6;&#xff0c;CSDN博客專家&#x1f3c6;&#xff0c;華為云享專家&#x1f3c6;&#xff0c;掘金年度人氣作…

Python---繼承

1、什么是繼承 我們接下來來聊聊Python代碼中的“繼承”&#xff1a;類是用來描述現實世界中同一組事務的共有特性的抽象模型&#xff0c;但是類也有上下級和范圍之分&#xff0c;比如&#xff1a;生物 > 動物 > 哺乳動物 > 靈長型動物 > 人類 > 黃種人 從哲學…

prometheus服務發現之consul

文章目錄 前言一、Consul 在這里的作用二、原理三、實現過程安裝 consul節點信息&#xff08;exporter&#xff09;注冊進去consul節點信息&#xff08;exporter&#xff09;從consul解除注冊&#xff1a;prometheus配置consul地址 總結 前言 我們平時使用 prometheus 收集監控…

接口的性能優化(從前端、后端、數據庫三個角度分析)

接口的性能優化&#xff08;前端、后端、數據庫&#xff09; 主要通過三方面進行優化 前端后端數據庫 前端優化 接口拆分 不要搞一個大而全的接口&#xff0c;要區分核心與非核心的接口&#xff0c;不然核心接口就會被非核心接口拖累 或者一個接口中大部分返回都很快&…

通過rc.local開機自啟執行nohup命令運行Flask,nohup.out中沒有Flask請求響應日志

需求 通過修改/etc/rc.d/rc.local&#xff0c;實現開機自啟Flask服務&#xff0c;CentOS 7.9。rc.local參考鏈接1&#xff0c;參考鏈接2。 問題 在/etc/rc.d/rc.local中添加 /home/python/face_jiance/kaijiziqi.sh 在/home/python/face_jiance/kaijiziqi.sh中寫 nohup /…

數據可視化軟件的興起:背后的驅動力

在當今信息時代&#xff0c;數據變得比以往任何時候都更為重要。數據可視化軟件的廣泛應用成為了一種趨勢。那么&#xff0c;為什么越來越多的人選擇使用數據可視化軟件呢&#xff1f;今天我就以自己的工作經驗為基礎&#xff0c;進行簡單的分析。 數據可視化軟件能將枯燥的數…

react-lazyload 的介紹、安裝、使用。

目錄 基本介紹 安裝 使用 基本使用 詳細屬性 基本介紹 react-lazyload 是一個 React 組件&#xff0c;用于延遲加載&#xff08;懶加載&#xff09;頁面上的圖片或其他資源。懶加載是一種優化手段&#xff0c;它允許頁面在初次加載時只加載可視區域內的內容&#xff0c;…

【Harmony】鴻蒙操作系統架構

目錄 導論 第一部分&#xff1a;內核與核心組件 1.1 鴻蒙微內核的設計 1.2 分布式能力的強化 1.3 HarmonyOS的分層架構 1.4 分布式數據管理 第二部分&#xff1a;鴻蒙的核心能力 2.1 華為 ARK Compiler的引入 2.2 分布式圖形界面的實現 2.3 統一的設備驅動框架 2.4 輕…

vue3移動端腳手架(純凈,集成豐富)

概述 一個純凈的移動端框架 &#xff0c;用到了 Vue3 vuex Vite3 Vant3 sass eslint stylelint htmlhint husky commitlint axios axios-adapter VConsole 自定義全局 loading &#xff0c;自定義函數式 dialog &#xff08;api模仿微信小程序&#xff09;&#x…

增強現實中的真實人/機/環與虛擬人/機/環

在增強現實中&#xff0c;真實人與虛擬人、真實機器與虛擬機器、真實環境與虛擬環境之間有著密切的關系。增強現實技術通過將真實與虛擬相結合&#xff0c;打破了傳統的現實世界與虛擬世界的界限&#xff0c;創造出了一種新的體驗方式。真實人、真實機器和真實環境與其對應的虛…