文档章节

js 心跳握手

appleZ
 appleZ
发布于 2015/12/03 13:24
字数 462
阅读 23
收藏 0
点赞 0
评论 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是异步操作 一般像我们这样的场景时间间隔都不精准,会有些偏差,我里面做了一下时间偏差的处理,时间会在下次心跳的时候做修补,提升了一点准确性。

© 著作权归作者所有

共有 人打赏支持
appleZ
粉丝 1
博文 25
码字总数 9774
作品 0
深圳
talent-tan/tio-websocket-showcase

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

talent-tan ⋅ 05/06 ⋅ 0

前端性能优化:细说JavaScript的加载与执行

本文主要是从性能优化的角度来探讨JavaScript在加载与执行过程中的优化思路与实践方法,既是细说,文中在涉及原理性的地方,不免会多说几句,还望各位读者保持耐心,仔细理解,请相信,您的耐...

小白师兄 ⋅ 06/19 ⋅ 0

最近排查android webview https的发热耗电和加载速度慢问题解决

最近排查android webview https的发热耗电和加载速度慢问题 问题:H5页面发热耗电 排查:通过android studio profiler 查看CPU消耗曲线,发现静置情况下webview轮播图波浪式消耗CPU,且峰值高...

ljianbing ⋅ 05/28 ⋅ 0

学习Javascript的8张思维导图

分别归类为:  javascript变量  javascript运算符  javascript数组  javascript流程语句  javascript字符串函数  javascript函数基础  javascript基础DOM操作  javascript正则表达式...

thinkyoung ⋅ 2014/09/23 ⋅ 0

code-rhythm:写了个vscode扩展,让代码更有快感

项目地址 Github - onvno/code-rhythm 原因 写代码本身是件快乐的事情,但开发中总有各种烦恼。 有时候一个很简单的方法,因为不确定传参的形式,不确定返回形式,不确定具体用法,就得翻墙,...

onvno_ ⋅ 06/07 ⋅ 0

iOS下JS与OC互相调用(六)--WKWebView + WebViewJavascriptBridge

iOS下JS与OC互相调用(六)--WKWebView + WebViewJavascriptBridge 转载:原地址 https://www.jianshu.com/p/e951af9e5e74 上一篇文章介绍了UIWebView 如何通过WebViewJavascriptBridge 来实现......

法斗斗 ⋅ 05/11 ⋅ 0

缅甸银河国际开户13170533331

解决这个问题涉及到两个方面的问题: 配置问题 、引入静态文件问题 1、配置问题 web.xml配置的DispatchServlet如下: [html] view plain copy springmvc org.springframework.web.servlet.D...

银河国际 ⋅ 05/26 ⋅ 0

JavaWeb01-HTML篇笔记(七)

.1 案例三:完成对注册页面的数据的简单校验.1.1.1 需求: 对注册页面的数据进行非空的简单校验!!!如果有某个值没有输入,点击提交,弹出一个对话框进行提示!! 1.1.2 分析:1.1.2.1 技术分...

我是小谷粒 ⋅ 04/28 ⋅ 0

JS对URL字符串进行编码/解码分析

一、为什么要进行js编码和解码? 只有字母和数字[0-9a-zA-Z]、一些特殊符号“$-_.+!*'(),”[不包括双引号]、以及某些保留字,才可以不经过编码直接用于URL。 出现的情况: 网址路径中包含汉字...

qq_38055050 ⋅ 05/12 ⋅ 0

爬虫获取 js 动态数据 (1)

爬虫遇到 js 动态数据时,主要解决方法有两种: 使用一些库,例如 Selenium,来模拟浏览器环境抓取数据。但这样做对内存和 CPU 的消耗都比较大,爬虫效率低,应尽量避免。 手动分析 js 请求,...

anye137 ⋅ 06/05 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

思路分析 如何通过反射 给 bean entity 对象 的List 集合属性赋值?

其实 这块 大家 去 看 springmvc 源码 肯定可以找到实现办法。 因为 spirngmvc 的方法 是可以 为 对象 参数里面的 list 属性赋值的。 我也没有看 具体的 mvc 源码实现,我这里只是 写一个 简...

之渊 ⋅ 24分钟前 ⋅ 0

vim使用手册--配对括号的查找

1、把光标放在标记有(、[或{处。 2、按%字符 3、此时光标的位置应当在配对的括号处 4、再次按%就可以跳回配对的第一个括号处。

dragon_tech ⋅ 28分钟前 ⋅ 0

c++ 、object-c printf,%02X和%x有什么区别 ?

%x即按十六进制输出,英文字母小写,右对齐。 %02X有以下变化:英文字母变大写,如果输出字符不足两位的,输出两位宽度,右对齐,空的一位补0。超过两位的,全部输出。 如果不用 %02x 会出现...

yizhichao ⋅ 33分钟前 ⋅ 0

Spring源码解析(七)——实例创建(中)

前言 上一节讲到了,Spring 会根据实例的作用域执行不同的创建逻辑,分别是 Singleton、Prototype、其他 Scope,其中 Singleton 会调用 getSingleton 从缓存中获取,缓存中没有才会创建实例;...

MarvelCode ⋅ 33分钟前 ⋅ 0

Thrift RPC实战(六) spring集成thrift

1.服务端设置 对泛型Thrift Service的支持, 通过采用spring配置以及反射的方式来实现.对于一个服务提供者来说,需要提供端口,接口以及接口实现类,因此在接口中spring配置文件中配置如下 <!...

lemonLove ⋅ 35分钟前 ⋅ 0

oracle11g自动分区使用

为什么使用自动分区? 在oracle11g之前,oracle是不支持自动分区功能的,这就可能导致我们系统在运行一段时间之后,就需要看看分区是否创建或者写触发器进行创建分区,否则就会导致数据无法入...

strict_nerd ⋅ 46分钟前 ⋅ 0

Spring mvc ViewResolver视图解析器实现机制

概要 我们在controller里面经常这样return一个ModelAndView。 return new ModelAndView("userList", "users", userList); DispatcherServlet 靠 ViewResolver 把 userList 解析为 /WEB-INF......

轨迹_ ⋅ 今天 ⋅ 0

策略模式

1.策略模式 策略模式是同一个行为的不同处理办法。策略模式和简单工厂模式的区别:1.策略模式主要是方法的执行方式,工厂模式要获取的对象。两者的侧重点不同。 ...

Cobbage ⋅ 今天 ⋅ 0

行政区划代码转为字典形式

原数据为: http://www.mca.gov.cn/article/sj/xzqh/2018/201804-12/201804-06041553.html 手动替换了一下格式,并使用下面的代码处理. # 输入格式s = """110000:北京市110101:东城区1101...

漫步海边小路 ⋅ 今天 ⋅ 0

android apk 签名

创建key,需要用到keytool.exe (位于C:\Program Files\Java\jdk1.6.0_10\bin目录下),使用产生的key对apk签名用到的是jarsigner.exe (位于C:\Program Files\Java\jdk1.6.0_10\bin目录下),把...

国仔饼 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部