文档章节

js 心跳握手

appleZ
 appleZ
发布于 2015/12/03 13:24
字数 462
阅读 33
收藏 0

1.背景:js需要收集一些信息上报

上报方式是开始 每隔 30s、1min、5min、10min。。上报一次数据,稳定后保持 xxmin上报一次,根据这个情景写了一段心跳握手 配合其他xx的对象进行数据发送

2.说明

构造函数可以传递三个参数 分别是 

timer, count, interval

timer 是一个数组,代表开始时指定间隔的时间段 例如 [30, 60, 90, 120] ,这样就会在开始后的 30s、60s、90、120s发送请求

count 是发送次数,循环上面的发动方式

interval 作用是循环完毕上面指定的时间间隔后一直以特定的时间间隔发送数据

方法只有三种:

add(fn)添加回调函数 

start 开始发送

stop 停止发送

3.下面是记录片段:

var HandShake = (function(){
		var timeout, timerCache;
		var startDate, intval = 0;
		var timerFn = [];
		var inaccuracies = 0;
		var isType = function(param){
			return function(obj){
					Object.prototype.toString.apply(obj) == "[object " + param +"]"
			}
		}
		var isArray = Array.isArray || isType("Array");
		var isFunction = isType("Function");
		
		var handShake = function(timer, count, interval){
			this.timer = timer;
			timerCache = Array.prototype.slice.call(timer);
			this.count = count;
			this.interval = interval;
		}
		
		handShake.prototype.add = function(fn){
			Array.prototype.push.call(timerFn, fn);
		}
		handShake.prototype.start = function(){
			
			var _this = this;
			startDate = startDate || +new Date;
			if(!this.timer.length){
				if(this.count > 1){
					this.count--;
					this.timer = Array.prototype.slice.call(timerCache);
					//this.start();
				}else{
					if(this.interval){
						this.timer = [this.interval];
					}else{
						return;
					}
				}
			}
			var timer_begin = this.timer.shift();
			intval += timer_begin;
			timeout = setTimeout(function(){ 
				var time = +new Date - startDate;
				//console.log(time);
				inaccuracies = time - intval * 1000;//inaccuracies 时间偏差 下次心跳补回来
				for(var i = 0; i < timerFn.length; i++)
				{
					timerFn[i]();
				}
				_this.start();
			}, timer_begin * 1000 - inaccuracies); 
		}
		
		handShake.prototype.stop = function(){
			intval = 0;
			inaccuracies = 0;
			clearTimeout(timeout);
		}
		return handShake;
	})();

4.总结:

握手这里很简单,有需要可以直接拷贝过去,只有一个地方需要说明, setTimeout是异步操作 一般像我们这样的场景时间间隔都不精准,会有些偏差,我里面做了一下时间偏差的处理,时间会在下次心跳的时候做修补,提升了一点准确性。

© 著作权归作者所有

共有 人打赏支持
下一篇: js Defer
appleZ
粉丝 1
博文 38
码字总数 9774
作品 0
深圳
私信 提问
MPush v0.0.6正式发布了!

v0.0.6 网关服务增加UDP及组播支持,后续网关部分的TCP部分将逐步淘汰 新增用户打标,修改标签,取消标签功能 全网推送增加按标签过滤,按条件过滤,条件表达式目前支持javascript Service模...

ohun
2016/12/04
1
0
关于websocket发送心跳,了解过的大咖聊聊,谢谢

websocket在客户端(分别是qt、网页)于服务器端交互的时候,发现qt发送的心跳数据是属于(instanceof)PingWebSocketFrame类的,而网页端利用js发送的心跳数据是属于TextWebSocketFrame类的...

System_In
2017/08/30
145
1
WebSocket断线重连问题

初用WebSocket,现在在项目里写了个心跳包,想用ReconnectingWebSocket实现断线后重连,我直接在心跳功能里面写的 ws=new ReconnectingWebSocket(Target+"?sessionId="+SessionId);,但在浏览...

不会飞的苏
2015/09/02
6.2K
4
websocket-heartbeat-js心跳检测库正式发布

前言: 两年前写了一篇websocket心跳的博客——初探和实现websocket心跳重连。 阅读量一直比较大,加上最近考虑写一个自己的npm包,因此就完成了一个websocket心跳的检测库。在这里先感谢几个...

10/15
0
0
Vue 全家桶,深入Vue 的世界

FinGet 26 日志 9 分类 15 标签 RSS GitHub E-Mail SegmentFault 推荐阅读 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理 前端进阶系列 八段代码彻底掌握 Promise 通俗大白话来理解...

FinGet
07/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

NEO区块链-DAPP开发直通车-第零篇

什么是DAPP DAPP 是以太坊发明的词汇 Decentralized Application. 目前基于区块链技术开发的应用程序广泛的接受使用了这一名称。 NEL将为开发DAPP提供全面的服务 什么是NEL NEL是 “NewEcon...

NEO-FANS
9分钟前
0
0
可视化软件VisIt在Ubuntu18.04上的安装

可视化软件VisIt在Ubuntu18.04上的安装 参考文档及使用说明 1.下载 在官网下载页面下载合适版本的安装文件,Ubuntu有专用的 https://wci.llnl.gov/simulation/computer-codes/visit/executa...

佚文
15分钟前
0
0
GROUP BY GROUPING SETS

GROUPING SETS 子句是 SELECT 语句的 GROUP BY 子句的扩展。通过 GROUPING SETS 子句,您可采用多种方式对结果分组,而不必使用多个 SELECT 语句来实现这一目的。这就意味着,能够减少响应时...

hblt-j
24分钟前
2
0
selenium之表格的定位

真的勇士, 敢于直面惨淡的warning、 敢于正视淋漓的error 目录 被测试网页的HTML代码 1.遍历表格所有单元格 2.定位表格中的某个元素 3.定位表格中的子元素 总结 浏览器网页常常会包含各类表...

程序猿拿Q
29分钟前
1
0
adb命令启动展讯平台工厂模式

adb命令启动展讯工厂模式: adb shell am start com.sprd.engineermode/com.sprd.engineermode.EngineerModeActivity 其它系统应用启动命令: 其他的一些应用启动命令,如下所示: calendar...

东街小霸王
30分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部