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

思路

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

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

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

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

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

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

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

目录

步骤

一、登录页面

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

代码
javascript 复制代码
//全局变量中的数据 
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,如果等于就执行心跳请求,并将全局变量的时间更改为当前时间

代码
javascript 复制代码
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,//请求心跳时间	
}

三、心跳请求

代码
javascript 复制代码
//心跳
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(); //定义刷新时间为当前时间

例如

javascript 复制代码
// 注销登录
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;
		});
}
相关推荐
2501_915106321 小时前
app 上架过程,安装包准备、证书与描述文件管理、安装测试、上传
android·ios·小程序·https·uni-app·iphone·webview
2501_915106322 小时前
使用 Sniffmaster TCP 抓包和 Wireshark 网络分析
网络协议·tcp/ip·ios·小程序·uni-app·wireshark·iphone
宠友信息3 小时前
2025社交+IM及时通讯社区APP仿小红书小程序
java·spring boot·小程序·uni-app·web app
“负拾捌”4 小时前
python + uniapp 结合腾讯云实现实时语音识别功能(WebSocket)
python·websocket·微信小程序·uni-app·大模型·腾讯云·语音识别
局外人LZ1 天前
Uniapp脚手架项目搭建,uniapp+vue3+uView pro+vite+pinia+sass
前端·uni-app·sass
2501_915918411 天前
在 iOS 环境下查看 App 详细信息与文件目录
android·ios·小程序·https·uni-app·iphone·webview
前端呆头鹅1 天前
Websocket使用方案详解(uniapp版)
websocket·网络协议·uni-app
浮桥1 天前
uniapp+h5 公众号实现分享海报绘制
uni-app·notepad++
2501_916007471 天前
没有 Mac 用户如何上架 App Store,IPA生成、证书与描述文件管理、跨平台上传
android·macos·ios·小程序·uni-app·iphone·webview
wangjun51591 天前
uniapp uni.downloadFile 偶发性下载文件失败 无响应
uni-app