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

news2024/10/1 12:16:27

思路

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.coloradmin.cn/o/1261314.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Oracle ORA12514 监听程序当前无法识别连接描述符中请求的服务

最简单的有可能是你的服务还没有开启&#xff0c;需要启动服务&#xff01;&#xff01;&#xff01;&#xff01; 在连接数据库的时候&#xff0c;有时会遇到一个“ORA12514&#xff1a;监听程序当前无法识别连接描述符中请求的服务”的错误&#xff0c;这个错误其实就是数据…

针对MAC上,面对8080端口被占用怎么解决

首先输入这个命令&#xff0c;在终端&#xff0c;这个是搜查命令&#xff0c;搜查当前8080端口被谁占着 sudo lsof -i :8080 杀死当前的进程 kill -9 1821 kill -9 (上面写着的PID)

NX二次开发UF_CURVE_ask_wrap_curves 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_wrap_curves Defined in: uf_curve.h int UF_CURVE_ask_wrap_curves(tag_t wrap_curve_object, int * num_output_curves, tag_t * * output_curves ) overview 概述 …

深度学习【二】

1.运行时错误 1.1 ModuleNotFoundError: No module named ‘torch_scatter’ 参考 https://blog.csdn.net/weixin_42421914/article/details/132875571 pip install --no-index torch-scatter -f https://pytorch-geometric.com/whl/torch-1.13.1%2Bcpu.html

unity学习笔记10

一、生命周期函数 1.Awake() 调用时间&#xff1a;对象被激活或创建时。 用途&#xff1a;通常用于初始化对象的状态&#xff0c;获取组件引用或执行其他在脚本生命周期早期需要完成的任务。 2.OnEnable(): 调用时间&#xff1a;对象激活时&#xff0c;包括对象被创建和Se…

2023_Spark_实验二十一:Zookeeper单机安装与配置

zookeeper单机安装与配置一、zookeeper的安装 1.上传zookeeper-3.4.5.tar.gz到/tools目录下 2.解压安装zookeeper到/training中 tar -zvcf zookeeper-3.4.5.tar.gz -C /opt/soft_installed/zookeeper-3.4.53.配置环境变量 vim /home/lh/.bashrc# 添加内容如下 export ZK_HOME…

京东运营数据分析(京东数据采集):2023年10月京东护肤行业品牌销售排行榜

鲸参谋监测的京东平台10月份护肤市场销售数据已出炉&#xff01; 鲸参谋数据显示&#xff0c;2023年10月份&#xff0c;京东平台上护肤市场的销量为2000万&#xff0c;环比增长约28%&#xff0c;同比降低约26%&#xff1b;销售额为25亿&#xff0c;环比增长约24%&#xff0c;同…

shell编程系列- bash和sh的区别

文章目录 引言bash和sh的区别CentOS下的区别Ubuntu下的区别 最佳实践 引言 我们在编写shell脚本时&#xff0c;通常第一行都要声明当前脚本的执行程序&#xff0c;也就是常见的 #!/bin/sh 或者是 #!/bin/bash &#xff0c;我们无论用哪一个脚本似乎都可以正常的执行&#xff0…

三丶openlayer之source和layer

1.source和layer的概念 在前面的例子中&#xff0c;已经对Source和Layer有所了解了&#xff0c;我们用天地图为底图加载出来东西&#xff0c;但是这个世界上的地图不仅仅是有天地图一种类型&#xff0c;比如Google地图&#xff0c;高德地图&#xff0c;百度地图等&#xff0c;…

Java中如何构建平衡二叉树

定义&#xff1a;平衡二叉树是一棵二叉排序树&#xff0c;或者为空&#xff0c;或者满足以下条件&#xff1a; 1)左右子树高度差的绝对值不大于1&#xff1b; 2)左右子树都是平衡二叉树。 平衡因子&#xff1a;左子树的高度减去右子树的高度&#xff0c;显然&#xff0c;在平衡…

【C/PTA —— 12.指针1(课内实践)】

C/PTA —— 12.指针1&#xff08;课内实践&#xff09; 6-1 交换两个整数的值6-2 利用指针找最大值6-3 字符串的连接6-4 移动字母 6-1 交换两个整数的值 void fun(int* a, int* b) {int* tmp *a;*a *b;*b tmp; }6-2 利用指针找最大值 void findmax(int* px, int* py, int* p…

Find My键盘|苹果Find My技术与键盘结合,智能防丢,全球定位

键盘是最常用也是最主要的输入设备&#xff0c;通过键盘可以将英文字母、汉字、数字、标点符号等输入到计算机中&#xff0c;从而向计算机发出命令、输入数据等。还有一些带有各种快捷键的键盘。随着时间的推移&#xff0c;渐渐的市场上也出现独立的具有各种快捷功能的产品单独…

VS2010配置opencv2.4.10

1.下载opencv2.4.10&#xff0c;百度网盘链接如下&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1UdoQJbRUEB_G2urT703xYQ 提取码&#xff1a;7lbd 2.运行opencv-2.4.10.exe&#xff0c;将文件提取到一个自定义目录里&#xff1a; 3.添加系统环境变量 在“系统变量…

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

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

Ubuntu新手使用教程

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

STM32_9(USART串口)

一、串口通信 串口是一种应用十分广泛的通讯接口&#xff0c;串口成本低、容易使用、通信线路简单&#xff0c;可实现两个设备的互相通信单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信&#xff0c;极大地扩展了单片机的应用范围&#xff0…

前缀和算法总结

前缀和思维导图&#xff1a; 一维前缀和算法模版&#xff1a; #include <iostream>using namespace std;const int N 100010;int n, m; int s[N];int main() {scanf("%d%d", &n, &m);for (int i 1; i < n; i){int x;scanf("%d", &…

​无人机石油管道巡检方案新亮点:灵活准确又高效

在当前石油工业的安全管理中&#xff0c;无人机技术逐渐成为一种不可或缺的工具。随着我国油气管道里程的持续增长&#xff0c;确保这些关键基础设施的安全运行变得越来越重要。传统的巡检方法已经无法满足现代油气行业的需求&#xff0c;而无人机石油管道巡检技术的应用提供了…

相同JS代码,多次混淆加密能得到不同的结果吗?

一份相同的JavaScript代码&#xff0c;进行多次混淆加密&#xff0c;能得到不同的结果吗&#xff1f; 答案是肯定的&#xff0c;能。 JShaman可以实现这个效果。即&#xff1a;加密结果具有多态性、变化性。 下面实测展示。 来到JShaman网站&#xff0c;用它默认的示例代码…

计算机网络——数据链路层-数据链路层概述(介绍、三个重要问题、使用广播信道的数据链路层、其他问题)

目录 介绍 三个重要问题 封装成帧 差错检测 可靠传输 使用广播信道的数据链路层 其他问题 介绍 本篇对数据链路层进行概述&#xff0c;我们首先来看看数据链路层在网络体系结构中的地位&#xff1a; 主机H1给主机H2发送数据&#xff0c;中间要经过三个路由器和电话网、…