uni-app:心跳机制基础逻辑(定时器方法解决)

思路

1、在登录的时候,定义一个存储当前时间的全局变量,并且开始心跳请求

2、在全局中定义一个定时器,该定时器每秒都会执行一次,并获取当前的时间

3、将定时器每秒的获取的当前时间和全局变量获取的时间进行比较

4、指定一个我需要执行心跳的间隔时间(这里举例:5s)

5、通过当前时间与全局变量中存储的时间进行比较,看是否等于5s,如果等于就执行心跳请求,并将全局变量的时间更改为当前时间

6、后面是考虑到有别的请求和心跳请求冲突的问题:如果有别的请求,我就需要在别的请求中开始时,刷新一下我全局变量中存储的时间(设置为当前时间),这样可以避免心跳请求正常执行导致和正常的请求发生冲突,但是需要给请求设置一个最大的请求时间,避免超时导致出现问题,见下连接

uni-app:如何配置uni.request请求的超时响应时间(全局+局部)_uni.request 超时-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_46001736/article/details/134435142?spm=1001.2014.3001.5501

目录

步骤

一、登录页面

1、在登录的时候,定义一个存储当前时间的全局变量,并且开始心跳请求(userlogin.vue)

代码
//全局变量中的数据 
uni.reLaunch({ //跳转到主页
	url: '/pages/mine/mine_index/mine_index?username=' + usernameinfo
})
setTimeout(function(){
	// 记录当前时间戳,存入时间戳
	getApp().globalData.refreshtime = Date.now();
	getApp().globalData.requesttime = Date.now();
	//成功登录开始心跳机制
	getApp().startHeartbeat();
},500)								
操作

1、全局变量refreshtime:记录与心跳时间进行比对的时间

2、全局变量requesttime:用于计算两次心跳的间隔时间

3、全局方法startHeartbeat(),用于启动心跳机制

二、全局页面App.vue

2、在全局中定义一个定时器,该定时器每秒都会执行一次,并获取当前的时间

3、将定时器每秒的获取的当前时间和全局变量获取的时间进行比较

4、指定一个我需要执行心跳的间隔时间(这里举例:5s)

5、通过当前时间与全局变量中存储的时间进行比较,看是否等于5s,如果等于就执行心跳请求,并将全局变量的时间更改为当前时间

代码
methods: {
	startHeartbeat() {
		console.log('开始心跳')
		this.heartbeatTimer = setInterval(() => {
			// console.log('存入的时间:',this.globalData.refreshtime)
			var nowtime = Date.now();
			// console.log('当前的时间:',nowtime)
			// 时间差
			var diffTime  =parseInt((nowtime-this.globalData.refreshtime)/1000)
			// console.log('时间差:',diffTime)
			//比较定义的心跳刷新时间5s和现在的时间差是否一致
			if(diffTime == 5){
				this.sendHeartbeatRequest();//发送心跳
				this.globalData.refreshtime = Date.now();
			}
		}, 1000); 
	},
	sendHeartbeatRequest() {
		var old_requesttime = this.globalData.requesttime
		var requesttime = Date.now();
		// 时间差
		var diffTime  =parseInt((requesttime-old_requesttime)/1000)
		console.log('两次请求的间隔差',diffTime);
		this.globalData.requesttime = requesttime;
		common.heart(this.globalData.access_token);
	}
},
globalData: {
	refreshtime:0,//刷新时间
	requesttime:0,//请求心跳时间	
}

三、心跳请求

代码
//心跳
function heart(access_token) {
	uni.request({
		url: ip + 'sys/token',
		data: {
			access_token: access_token
		},
		method: 'POST',
		dataType: 'json',
		header: {
			"content-type": "application/json"
		},
		success: res => {
			console.log("成功心跳", res)
		},
		fail(res) {
			console.log(res)
		}
	});
}
...//别的方法或变量
module.exports = {
	heart,
    ...//别的方法名
}

四、请求别的方法

在请求方法之前设置全局变量的值为当前时间

getApp().globalData.refreshtime = Date.now(); //定义刷新时间为当前时间

例如

// 注销登录
function logout(cmd, access_token, usrname, passwd) {
	function requestWithRetry(cmd, usrname, passwd, access_token, retryCount) {
		return new Promise((resolve, reject) => {
			getApp().globalData.refreshtime = Date.now(); //定义刷新时间为当前时间
			uni.request({
				url: ip + 'sys/user/logout',
				data: {
					cmd: cmd, //随机生成的数
					access_token: access_token,
					usrname: usrname,
					passwd: passwd
				},
				method: 'POST',
				dataType: 'json',
				success(res) {
					console.log(`注销登录:第 ${retryCount} 次请求成功:`, res.data);
					resolve(res.data); // 返回成功的结果		
				},
				fail(res) {
					console.error(`注销登录:第 ${retryCount} 次请求失败,剩余重试次数 ${retryCount - 1}:`, res)
					if (retryCount <= 1) {
						// 重试次数已经用完,将错误信息返回给调用者
						reject(new Error('请求失败'))
					} else {
						// 还有重试次数,继续重试
						setTimeout(() => {
							requestWithRetry(cmd, usrname, passwd, access_token,
								retryCount - 1).then(resolve).catch(reject)
						}, 500)
					}
				}
			});
		});
	}
	// 调用方法,retryCount 为重试次数
	return requestWithRetry(cmd, usrname, passwd, access_token, 3)
		.then(data => {
			// console.log('请求成功', data);
			return data;
		})
		.catch(error => {
			// console.log('请求失败', error);
			throw error;
		});
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/192118.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ShardingSphere-JDBC 入门教程(v4.1.1)

框架介绍 ShardingSphere-JDBC 定位为轻量级 Java 框架&#xff0c;在 Java 的 JDBC 层提供的额外服务。它使用客户端直连数据库&#xff0c;以 jar 包形式提供服务&#xff0c;无需额外部署和依赖&#xff0c;可理解为增强版的 JDBC 驱动&#xff0c;完全兼容 JDBC 和各种 OR…

SSRF漏洞防御:黑白名单的编写

SSRF漏洞防御:黑白名单的编写 以pikachu靶场中SSRF(crul)为例 我们可以看到未做任何防御 我们查看源代码 黑名单的制作 思路: 什么内容不能访问 构造代码 $xyarray("file" > "","http" > "","https" > …

国产1433D/E/F/H手持式信号发生器,可覆盖到50GHz

1433D/E/F/H信号发生器 1433系列信号发生器是中电科思仪科技股份有限公司专为外场测试设计的一款手持式仪器&#xff0c;具有连续波信号输出、频率/幅度/脉冲多种调制、大动态范围幅度调节、步进/列表扫描等功能&#xff0c;采用8.4寸大屏幕液晶及电容触摸屏一体化设计&#xf…

简单订单和支付业务的相关流程

1、订单创建、支付及订单处理流程图 2、创建HTTP客户端工具类 Slf4j public class HttpclientUtil {//类中定义了一个私有静态成员变量instance&#xff0c;并且将其初始化为HttpclientUtil类的一个实例&#xff0c;用于实现单例模式。private static HttpclientUtil instance…

NOIP2007提高组第二轮T3:矩阵取数游戏

题目链接 [NOIP2007 提高组] 矩阵取数游戏 题目描述 帅帅经常跟同学玩一个矩阵取数游戏&#xff1a;对于一个给定的 n m n \times m nm 的矩阵&#xff0c;矩阵中的每个元素 a i , j a_{i,j} ai,j​ 均为非负整数。游戏规则如下&#xff1a; 每次取数时须从每行各取走一…

销售心理学 如何了解客户的购买心理激发客户购买兴趣

销售心理学 如何了解客户的购买心理激发客户购买兴趣 在销售的世界里&#xff0c;掌握客户的购买心理&#xff0c;如同一把神奇的钥匙&#xff0c;能够解锁客户内心的需求和兴趣。如何巧妙地运用销售心理学&#xff0c;激发客户的购买欲望呢&#xff1f;以下是一些建议&#x…

实战|信息泄露

0x01系统初探 通过fofa对大学进行搜索 fofa:host"edu.cn" &amp;&amp; status_code"200"在随意的翻阅查看时&#xff0c;发现访问xxx.edu.cn登录页面会优先访问登录后的页面&#xff0c;再跳转至登录页面。盲猜应该是前端校验&#xff0c;可以通过…

DEM分析

一、实验名称&#xff1a; DEM分析 二、实验目的&#xff1a; 通过本实验练习&#xff0c;掌握DEM的建立与应用基本方法。 三、实验内容和要求&#xff1a; 实验内容&#xff1a; 利用ARCGIS软件相关分析工具及实验数据&#xff0c;创建DEM&#xff0c;并计算相应坡度的区…

FlashDuty Changelog 2023-10-30 | 告警路由与 Slack 应用

FlashDuty&#xff1a;一站式告警响应平台&#xff0c;前往此地址免费体验&#xff01; 告警路由 什么是告警路由&#xff1f; FlashDuty已经与Zabbix、Prometheus等监控系统实现无缝集成&#xff0c;通过一个简单的webhook就可以把告警系统产生的所有告警事件推送到FlashDut…

Simulink 模型简单加密

本文介绍的Simulink模型的简单加密方法&#xff0c;即简单禁止用户查看和修改模块内部结构&#xff0c;不对模型生成的源代码进行控制。如果想采用编译加密&#xff08;用户采用模型生成的代码也能进行加密控制&#xff09;&#xff0c;参见&#xff1a;Simulink模型编译加密共…

位图(bitset)和布隆过滤器

位图将数字映射到比特位上&#xff0c;用0&#xff0c;1来表示数据存在与否。 适用场景&#xff1a;大量数据(2^32次方约为40亿数据&#xff0c;0.5GB)&#xff0c;判断存在与否。 template<size_t N> class Bitset { public:Bitset(){// 在x86下size_t表示四个字节&am…

EM32DX-C1【分布式io】

1设备类型&#xff1a; 电压&#xff1a;DC24V 输入16点 输出16点雷赛 EM32DX-C1 模块是一款基于 ASIC 技术的高性能、高可靠性的 CANopen 总线数字 量输入输出扩展模块&#xff0c;具有 16 路通用输入接口和 16 路通用输出接口。输入输出接口均采用光 电隔离和…

规则引擎Drools使用,0基础入门规则引擎Drools(四)WorkBench控制台

文章目录 系列文章索引八、WorkBench简介与安装1、WorkBench简介2、安装 九、WorkBench使用方式1、创建空间2、创建项目3、创建数据对象4、创建DRL规则文件5、创建测试场景6、设置KieBase和KieSession7、编译、构建、部署8、在项目中使用部署的规则 系列文章索引 规则引擎Droo…

Spring Security 6.1.x 系列(6)—— 显式设置和修改登录态

一、前言 此篇是对上篇 Spring Security 6.1.x 系列&#xff08;5&#xff09;—— Servlet 认证体系结构介绍 中4.9章节显式调用SecurityContextRepository#saveContext进行详解分析。 二、设置和修改登录态 2.1 登录态存储形式 使用Spring Security框架&#xff0c;认证成…

创建可以离线打包开发的uniapp H5项目

安装node环境 略 安装vue脚手架&#xff0c;在线 npm install -g vue/cli PS&#xff1a;vue-cli已进入维护模式&#xff0c;vue3最新脚手架使用npm init vuelatest安装&#xff0c;安装后使用create-vue替换vue指令&#xff0c;create-vue底层使用vite提升前端开发效率&…

计算机视觉算法——基于Transformer的目标检测(DN DETR / DINO / Sparser DETR / Lite DETR)

计算机视觉算法——基于Transformer的目标检测&#xff08;DN DETR / DINO&#xff09; 计算机视觉算法——基于Transformer的目标检测&#xff08;DN DETR / DINO&#xff09;1. DN DETR1.1 Stablize Hungarian Matching1.2 Denoising1.3 Attention Mask 2. DINO2.1 Contrasti…

Qt5.15.2静态编译 VS2017 with static OpenSSL

几年前编译过一次Qt静态库:VS2015编译Qt5.7.0生成支持XP的静态库,再次编译,毫无压力。 一.环境 系统:Windows 10 专业版 64位 编译器:visual studio 2017 第三方工具:perl,ruby和python python用最新的3.x.x版本也是可以的 这三个工具都需要添加到环境变量,安装时勾选…

获取数据库中最占用内存的sql语句

SELECT TOP 20 total_worker_time/1000 AS [总消耗CPU 时间(ms)],execution_count [运行次数], qs.total_worker_time/qs.execution_count/1000 AS [平均消耗CPU 时间(ms)], last_execution_time AS [最后一次执行时间],min_worker_time /1000 AS [最小执行时间(ms…

桥梁道路结冰传感器守护出行安全的重要工具

随着冬季的到来&#xff0c;气温逐渐降低&#xff0c;路面和桥梁容易结冰&#xff0c;给人们的出行带来安全隐患。为了解决这一问题&#xff0c; WX-JB2H 桥梁道路结冰传感器应运而生。本文将详细介绍桥梁道路结冰传感器的作用、原理及在冬季出行中的重要性。 一、桥梁道路结冰…

Webhook端口中的自签名身份验证

概述 有时&#xff0c;可能需要通过 Webhook 端口从交易伙伴处接收数据&#xff0c;但该交易伙伴可能需要更多的安全性&#xff0c;而不仅仅是用于验证入站 Webhook 请求的基本身份验证用户名/密码 – 或者您可能只想在入站 Webhook 消息上添加额外的安全层。 使用 Webhook 端…
最新文章