js 心跳握手
博客专区 > appleZ 的博客 > 博客详情
js 心跳握手
appleZ 发表于2年前
js 心跳握手
  • 发表于 2年前
  • 阅读 15
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: 工作需要写一下js心跳握手

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是异步操作 一般像我们这样的场景时间间隔都不精准,会有些偏差,我里面做了一下时间偏差的处理,时间会在下次心跳的时候做修补,提升了一点准确性。

共有 人打赏支持
粉丝 2
博文 25
码字总数 9774
评论 (0)
×
appleZ
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: