JS 定时器(异步/同步)

关于setInterval(),setTimeout()使用:

在Web开发中,肯定会用到轮询,也即不停地以某个时间值去执行你想要执行的Function,也许你还想传参数,可是你会传吗?当你看到这两个方法只接受两个参数后,也许你就真的不知道应该怎么传额外的自己的参数了,这里直接看代码,很简洁、方便、易用的代码:



<div style="height: 100px;width: 200px;float: right;">
<button id="btn">Clear Timer</button>
</div>
<script type="text/javascript">
var timer = {
timers:{},
start:function(asyn,fun,delay,id){
if(typeof fun === "function"){
var args = Array.prototype.slice.call(arguments,4),t,func,_this = this;
func = function(args){
var ags = arguments;
if(!Array.isArray) {
Array.isArray = function (vArg) {
return Object.prototype.toString.call(vArg) === "[object Array]";
};
}
if(!Array.isArray(args))
ags = Array.prototype.slice.call(arguments,0)
else
ags = args;
fun.apply(null,ags);
if(asyn){
console.log("asynchronous timer");
_this.timers[id] = setInterval(function(){
fun.apply(null,ags);
},delay);
}else{
console.log("synchronous timer");
_this.timers[id] = setTimeout(function(){
func.apply(null,ags);
},delay);
}
};
setTimeout(func,delay,args);
}
},
clear:function(id){
clearTimeout(this.timers[id]);
clearInterval(this.timers[id]);
delete this.timers.id;
}
};
function f1(p){
console.log("f1() : param1 : "+p+" , param2 : "+arguments[1] + " , param3 : "+arguments[2] + " " + new Date());
}
//test
timer.start(true,f1,2000,"asyn","aa","bb","cc");
// timer.start(false,f1,2000,"asyn","aa","bb","cc");

$("#btn").click(function(){
$.each(timer.timers,function(k,v){
console.log("key : "+k+" , v : "+v);
})
timer.clear("asyn")
});
</script>


在timer.start()方法中,前4个参数是必需滴,第一个参数代表是否是异步,第二个参数代表你想要执行的function,第三个参数是时间间隔(几秒执行一次),第四个参数是给你的定时器指定一个标识(用来取消你所设置的定时器),第四个以后你可以随便传,想传多少传多少,根据需要,只要你传了就可以在你的目标方法里获取到,在这里是f1(),我已经测试过了,没有问题可以拿到值。

想来想去觉得还是有必要解释下异步和同步的区别:
异步(setInterval(fun,delay)):即不管你的目标方法在fun在指定的时间delay内是否执行完毕,当时间间隔达到delay,浏览器总会几乎(因为浏览器也不是很严格的,毕竟是秒啊,可能会相差个几十或者几百或者几千毫秒)按时去执行目标方法fun。
比如:1:00:00开始执行,间隔是2毫秒,则浏览器打印的是:
1:00:02
1:00:04
1:00:06
1:00:08

同步(setTimeout(fun,delay)):即如果你的目标方法在fun在指定的时间delay内没有执行完毕,当时间间隔达到delay,浏览器总是不会去执行目标方法fun,直到本次执行完毕,才会触发下一次.
比如:1:00:00开始执行,间隔是2毫秒,则浏览器打印的是:
1:00:02(第一次)
//执行你的代码的时间,视你的目标方法fun执行的时间长短而定,假如执行了10秒
1:00:14(第二次的时间就是第一次的时间+执行目标方法fun耗费的时间10秒+间隔2毫秒)
。。。。

怎么测试呢?我就懒得测了,我只给出测试方案,在你的目标方法里执行ajax调用,在你的后台程序里假如是Servlet里加断点停留,超过指定的delay,如果是异步的,你应该会发现多个请求到达后台,而如果是同步的,只有一个请求,执行完当前请求才会继续执行第二次请求。

如有更好的实现或者任何问题,欢迎探讨!
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值