有人问我在“循环ajax”那个日志后面写setTimeout是伪多线程。
那我就代码说明一下:列子3个
1、第一个
<html>
<head>
<script>
setTimeout("aa()",20);
setTimeout("dd()",20);
setTimeout("cc()",21);
function aa()
{
document.getElementById("id1").innerHTML="执行了aa方法";
document.getElementById("id4").innerHTML="最后执行了aa方法";
}
function dd(){
var time1=new Date().getMilliseconds();
for(i=0;i<1000;i++){
j=new Date().getMilliseconds();
}
var time2 = new Date().getMilliseconds();
document.getElementById("id2").innerHTML="执行dd方法 用时:"+(time2-time1)+"毫秒";
document.getElementById("id4").innerHTML="最后执行了dd方法";
}
function cc(){
document.getElementById("id3").innerHTML="执行了CC";
document.getElementById("id4").innerHTML="最后执行了cc方法";
}
</script>
<head>
<body>
<div id="id1"></div>
<div id="id2"></div>
<div id="id3"></div>
<div id="id4"></div>
</body>
</html>
执行结果是:
setTimeout(function () { alert('end 2'); }, 2000);
setTimeout(function () { alert('end 1'); }, 100);
alert('end');执行的结果是弹出‘end’‘end 1’,然后浏览器假死,就是不弹出‘end 2’。也就是说第一个settimeout里执行的时候是一个死循环,这个直接导致了理论上比它晚一秒执行的第二个settimeout里的函数被阻塞,这个和我们平时所理解的异步函数多线程互不干扰是不符的。
function testAsynRequest() {
var url = "/AsyncHandler.ashx?action=ajax";
xmlReq.open("post", url, true);
xmlReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlReq.onreadystatechange = function () {
if (xmlReq.readyState == 4) {
if (xmlReq.status == 200) {
var jsonData = eval('(' + xmlReq.responseText + ')');
alert(jsonData.message);
}
else if (xmlReq.status == 404) {
alert("Requested URL is not found.");
} else if (xmlReq.status == 403) {
alert("Access denied.");
} else {
alert("status is " + xmlReq.status);
}
}
};
xmlReq.send(null);
}
testAsynRequest();//1秒后调用回调函数
while (true) {
{
string action = context.Request["ajax"];
Thread.Sleep(1000);//等1秒
string jsonObject = "{\"message\":\"" + action + "\"}";
context.Response.Write(jsonObject);
}理论上,如果ajax异步请求,它的异步回调函数是在单独一个线程中,那么回调函数必然不被其他线程”阻挠“而顺利执行,也就是1秒后,它回调执行弹出‘ajax’,可是实际情况并非如此,回调函数无法执行,因为浏览器再次因为死循环假死。