文档章节

js 心跳握手

appleZ
 appleZ
发布于 2015/12/03 13:24
字数 462
阅读 32
收藏 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
深圳
私信 提问
Vue 全家桶,深入Vue 的世界

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

FinGet
07/02
0
0
websocket-heartbeat-js心跳检测库正式发布

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

10/15
0
0
利用Resource Timing监控资源加载速度

Resource Timing API Resource Timing API提供了让用户查看一个资源从输入url到下载下来经历的各个过程所消耗的时间,借此可以来衡量网站的性能。 我们可以通过Resource Timing Api监控哪个阶...

viki_lee
09/05
0
0
talent-tan/tio-websocket-showcase

tio-websocket-showcase 项目介绍 展示tio-websocket的用法,官方提供的唯一tio-websocket示范教程 包括wss和流量监控及处理等高级特性 还包括t-io作者写的一个用于连接websocket服务器的js小...

talent-tan
05/06
0
0
web socket and web worker 基础原理及使用

个人认为HTML5最吸引人的两大功能, web socket 和 worker为构建高效能的web应用提供了新的参考方案。 大体来说,web socket提供更高效的传输协议,web worker提供多线程提高web应用计算效率...

ancient_wind
2015/05/25
0
1

没有更多内容

加载失败,请刷新页面

加载更多

nuc970 uboot nand-boot,kernel, filesystem 烧录位置

一 烧写到Nand Flash **1.1 **相关文件说明 l BSP版本:nuc970bsp-release-20150519.zip l NuWriter版本:2015/04/28-V01,nuvoTon Nu-Writer V1.0 l 烧写文件: u-boot-spl.bin:负责将u-b......

CookieDemo
14分钟前
1
0
python中sort和sorted函数小结

L.sort(cmp=None, key=None, reverse=False) sorted(iterable, cmp=None, key=None, reverse=False) 这样看,sorted函数只比sort函数多一个iterable参数,其余没什么不同,iterable是一个迭代......

上官夏洛特
41分钟前
3
0
thinkphp 常用SQL执行语句总结

第一条:Db::tablera('vr_panomas')->where(['delete_time'=>0,'id'=>['in',$pids]])->field(['id'=>'id','post_thumb'=>'thumb','post_title'=>'title','post_tags'=>'tags','post_price'=>......

koothon
51分钟前
1
0
支付宝返回状态resultStatus意思

上一篇集成支付宝的时候,会有一些支付宝返回的resultStatus,具体意思是: 9000 订单支付成功 8000 正在处理中 4000 订单支付失败 6001 用户中途取消 6002 网络连接出错 还有memo,意思就是...

RainOrz
55分钟前
2
0
electron webview 页面加载事件顺序

1.did-start-loading 页面开始加载 2.load-commit 主页面文档加载 3.page-title-updated title 4.dom-ready 主页面 dom 加载完成 5.load-commit frame文档加载 6.did-frame-finish-load fram......

dubox
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部