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.mzph.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;创造出了一种新的体验方式。真实人、真实机器和真实环境与其对应的虚…