`

javascript实现在一定时间段内相同请求之执行一次

阅读更多

方法一:(此方法是建立在假设javascript的执行存在并发性的情况,并假设uuid获得一定是唯一的id)

/** 利用Array的push本身具有次序,最后肯定只有一个对象在首位 */

function Delayer(callback,delayTime){
    this.callback = callback;
	this.count = 0;
    this.delayTime = delayTime;
	this.queue = new Array();
	this.ring = 0;
}

/* 此方法为UUID实现摘自网络 */
Delayer.prototype.getUniqueId = function(){
	var s = [], itoh = '0123456789ABCDEF';

	// Make array of random hex digits. The UUID only has 32 digits in it, but we
	// allocate an extra items to make room for the '-'s we'll be inserting.
	for (var i = 0; i <36; i++) s[i] = Math.floor(Math.random()*0x10);

	// Conform to RFC-4122, section 4.4
	s[14] = 4;  // Set 4 high bits of time_high field to version
	s[19] = (s[19] & 0x3) | 0x8;  // Specify 2 high bits of clock sequence
	
	// Convert to hex chars
	for (var i = 0; i <36; i++) s[i] = itoh[s[i]];
	
	// Insert '-'s
	s[8] = s[13] = s[18] = s[23] = '-';

	return s.join('')+'-'+(++this.ring); //通过ring更加提高唯一性
}

Delayer.prototype.delay = function(){
	//减少后来者进入
	if (this.count == 0) {
		++this.count;
		var uniqueId=this.getUniqueId();
		this.queue.push(uniqueId);
		//通过判断第一push进去的id是否是自己来决定是否执行
		if (this.queue[0] == uniqueId) {
			var self=this; 
			setTimeout(function(){
				try{self.callback();}catch(err){}
				//执行完后将值清空,保证下次还能执行
				finally{
					self.count = 0;
					self.queue = new Array();
					if(self.ring > 9999) self.ring = 0;
				}
			},this.delayTime);
		}
	}
}

 

方法二:(更为简洁,不过是以假设++variable的值一定不会相同为前提)

function Delayer(callback,delayTime){
    this.callback = callback;
	this.count = 0;
    this.delayTime = delayTime;
}

Delayer.prototype.delay = function(){
	if(++this.count==1){
		var self=this; 
		setTimeout(function(){
			try{self.callback();}catch(err){}
			//执行完后将值清空,保证下次还能执行
			finally{
				self.count = 0;
			}
		},this.delayTime);
	}
}
 

 

执行代码如下:

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>Untitled Document</title>
	</head>
	<body>
	</body>
	<script type="text/javascript" src="Delayer.js"></script>
	<script type="text/javascript">
	function sayHello(){alert('hello')}
	var sayHelloDelayer = new Delayer(sayHello,100);
	sayHelloDelayer.delay();
	sayHelloDelayer.delay();
	sayHelloDelayer.delay();
	sayHelloDelayer.delay();
	sayHelloDelayer.delay();
	</script>
</html>
 

 

分享到:
评论

相关推荐

    Javascript中setTimeOut和setInterval的定时器用法

    Javascript的setTimeOut和setInterval函数应用非常广泛,它们都用来处理延时和定时任务,比如打开网页一段时间后弹出一个登录框,页面每隔一段时间发送异步请求获取最新数据等等。但它们的应用是有区别的。 ...

    jquery插件使用方法大全

    开发人员借此可以使用无法立即获得的返回值(如异步Ajax请求的返回结果),而且第一次能够附加多个事件处理器。 例如,使用了新的jQuery内部Ajax API就可以实现下面的代码了: // Assign handlers immediately ...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    HybridApp 一种可以下载的Native App,其用户界面的全部或者部分元素在嵌入式浏览器组件(WebView之类的)里面运行 优雅降级 一开始就构建站点的完整功能,然后针对浏览器测试和修复。认为应该针对那些最高级、最...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -修正了使用IFrameUrl的Tab在切换过程中会重复加载的问题,这是一个在v2.1.6引入的问题(feedback:eroach)。 -修正了启用AutoPostBack的Grid,其RowClick会覆盖LinkButtonField, HyperLinkField, CheckBoxField的...

    最新Java面试宝典pdf版

    38、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 25 39、下面的程序代码输出的结果是多少? 25 40、final, finally, finalize的区别。 27 ...

    超实用的jQuery代码段

    超实用的jQuery代码段精选近350个jQuery代码段,涵盖页面开发中绝大多数要点、技巧与方法,堪称史上最实用的jQuery代码参考书,可以视为网页设计与网站建设人员的好帮手。《超实用的jQuery代码段》的代码跨平台、跨...

    JAVA上百实例源码以及开源项目源代码

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    Java面试宝典2010版

    38、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 39、下面的程序代码输出的结果是多少? 40、final, finally, finalize的区别。 41、...

    Java面试笔试资料大全

    38、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 25 39、下面的程序代码输出的结果是多少? 25 40、final, finally, finalize的区别。 27 ...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    由于客户端的硬件配置可能存在差异,软件环能各不相同,因此,在安装时,必须对每一个客户端分别进行配置,同样,在软件升级时也要对客户端分别处理。 B/S模式带来了巨大的好处: 开发成本及维护成本降低。由于B/S...

    Java面试宝典-经典

    38、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 25 39、下面的程序代码输出的结果是多少? 25 40、final, finally, finalize的区别。 27 ...

    JAVA面试宝典2010

    38、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 25 39、下面的程序代码输出的结果是多少? 25 40、final, finally, finalize的区别。 27 ...

    java面试题大全(2012版)

    38、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 25 39、下面的程序代码输出的结果是多少? 25 40、final, finally, finalize的区别。 27 ...

    Java面试宝典2012版

    38、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 25 39、下面的程序代码输出的结果是多少? 25 40、final, finally, finalize的区别。 ...

    Java面试宝典2012新版

    38、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 25 39、下面的程序代码输出的结果是多少? 25 40、final, finally, finalize的区别。 27 ...

    java面试宝典2012

    38、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 27 39、下面的程序代码输出的结果是多少? 28 40、final, finally, finalize的区别。 30 ...

    JAVA上百实例源码以及开源项目

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    ExtAspNet_v2.3.2_dll

    -修正extjs最新版本(v3.2.2)中的一个bug,如果下拉列表中存在两个相同的Text,则SelectedValue返回值永远是第一个Text的值(feedback:ben.zhou)。 -应用补丁#6593, #6621(feedback:vbelyaev)。 +修正IE7下Grid分页...

Global site tag (gtag.js) - Google Analytics