关于SetTimeOut()方法的线程问题研究

  今天在研究一个防止用户快速点击画面按钮,导致的ajax 出错问题时:

想着在开始点击的之后的把画面按钮的活性设为非活,后再最后执行之后在设为活性

代码如下:

function  search(){
$("#btn").attr("Disabled",true);

....
..
sleep(2000);
$("#btn").attr("Disabled",false);                 
}
function  sleep( numberMillis){
var nowTime = new Date();
var exitTime =  nowTime.getTime()+numberMillis;
while(true){
nowTime = new Date();
        if (nowTime.geTime()>exitTime)   return;
}
}


发现效果并不是自己想要的,其他画面效果永远是等待线程执行完之后在出现

function  search(){

$("#btn").attr("Disabled",true);

//......

....

..

setTimeOut($("#btn").attr("Disabled",false),2000);

            

}

后 改成 ,达到了自己想要的效果  部分画面效果会先处理,2秒之后 画面按钮变成活性

但是JavaScript 不是单线程吗,关于SetTimeOut 他是怎样实现的(利用回调函数实现异步)?

对SetTimeOut多线程异步假设实验

 	setTimeout(function () { while (true) { } }, 1000);
        setTimeout(function () { alert('end 2'); }, 2000);
        setTimeout(function () { alert('end 1'); }, 100);
弹出end1后,然后浏览器假死,就是不弹出‘end 2’,说明在执行
setTimeout(function () { while (true) { } }, 1000);时进入死循环后,
这个直接导致了理论上比它晚一秒执行的第二个settimeout里的函数被阻塞,这个和我们平时所理解的异步函数多线程互不干扰是不符的



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值