今天在研究一个防止用户快速点击画面按钮,导致的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里的函数被阻塞,这个和我们平时所理解的异步函数多线程互不干扰是不符的setTimeout(function () { while (true) { } }, 1000);时进入死循环后,