setTimeout,xhr,event线程问题

5 篇文章 0 订阅

由   http://lifesinger.org/blog/?p=1568    所想

 

1. javascript 是单线程的,其实只有 xhr是新开了一个线程而已。

 

第一段代码:

 

Js代码
  1. setTimeout( function  () {  
  2.     alert(1);  
  3. },  
  4. 0);  
  5. setTimeout(function  () {  
  6.     alert(2);  
  7. },  
  8. 0);  
  9. Ext.ajax.request({  
  10.     url: 'xx.不存在' ,  
  11.     failture: function  () {  
  12.         alert(3);  
  13.     }  
  14. });  

 

alert : 会阻塞当前线程

 

则会先弹出1(不要点确定),等会弹出3,而2只有点击 1,3 都确定后才会弹出

 

第二段代码:

 

Js代码
  1. setTimeout( function  () {  
  2.     for  ( var  i = 0; i < 2000; i++)  
  3.     console.log('  main thread  '  + i);  
  4. },  
  5. 0);  
  6. setTimeout(function  () {  
  7.     for  ( var  i = 0; i < 1000; i++)  
  8.     console.log('  main thread-2  '  + i);  
  9. },  
  10. 0);  
  11. Ext.ajax.request({  
  12.     url: 'xx.不存在' ,  
  13.     failture: function  () {  
  14.         alert(3);  
  15.         for  ( var  i = 0; i < 100; i++)  
  16.         console.log('  sub thread  '  + i);  
  17.         alert(4);  
  18.     }  
  19. });  

 

则会 先打印main thread 0,main thread 1,.... 还没到 main thread 1999 时 就 alert(3) ,点确认后 alert(4) , 注意其间 main thread 打印 一直没停, 一直 到 main thread 1999 , 然后 main thread-2 0 main thread-2 1 一直到 main thread-2 999 ,然后 才是 sub thread 0 ....sub thread 99 ,可见只有 ajax 的回调 alert  先弹出了 (与alert 顺序无关),他后面的操作 放在 javascript单线程事件 队列里面

------------------------------------------总结一下

可能不太对, 第二段代码 在 ff 中表现如上,在ie 中 装了 Companion.JS,但是不太准确(打印了3000个log后才弹出alert(3))


故:看见 alert 操作很特殊 可能与事件队列无关,ajax 是新开一个线程 ,返回时,处理函数放在javascript 事件队列的末尾,但里面的 alert 不管顺序挨各先执行.(对应第二段代码)


ajax 回调的alert 可插在 原先的 alert 后面 ,而 原先alert后面的alert 则要等 ajax 回调的alert 点击确定后才能执行。 (对应第一段代码)

 

2.ie element 的事件添加为 先进后出,其他浏览器为 队列 后进后出,不过 setTimeout  都一样的,把定时运行函数放在当前所有操作的最后处理。

 

测试代码:

 

Html代码
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
  2.         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">   
  3. < html   xmlns = "http://www.w3.org/1999/xhtml"   lang = "en"   xml:lang = "en" >   
  4. < head >   
  5. < title > singleThread 测试 </ title >   
  6. < script   type = "text/javascript"   src = "ext-base.js" > </ script >   
  7. < script   type = "text/javascript"   src = "ext-core.js" > </ script >   
  8. < script   type = "text/javascript" >   
  9. //<![CDATA[  
  10. var no=0;  
  11. Ext.onReady(function() {  
  12.     Ext.get('t').on('click',function(){  
  13.         setTimeout(function(){  
  14.             alert('first click timeout ok');  
  15.         },0);  
  16.         alert('first click');  
  17.         Ext.getDom('debug').innerHTML+=1+'<br />'  
  18.     });  
  19.       
  20.     Ext.get('t').on('click',function(){  
  21.         alert('second click');  
  22.         Ext.getDom('debug').innerHTML+=2+'<br />'  
  23.     });  
  24.       
  25. });  
  26. //]]>   
  27. </ script >   
  28. </ head >   
  29. < body >   
  30. < input   type = 'button'   id = 't'   value = 'click me please'   />   
  31. < div   id = 'debug' >   
  32. </ div >   
  33. </ body >   
  34. </ html >   
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>singleThread 测试</title>
<script type="text/javascript" src="ext-base.js"></script>
<script type="text/javascript" src="ext-core.js"></script>
<script type="text/javascript">
//<![CDATA[
var no=0;
Ext.onReady(function() {
	Ext.get('t').on('click',function(){
		setTimeout(function(){
			alert('first click timeout ok');
		},0);
		alert('first click');
		Ext.getDom('debug').innerHTML+=1+'<br />'
	});
	
	Ext.get('t').on('click',function(){
		alert('second click');
		Ext.getDom('debug').innerHTML+=2+'<br />'
	});
	
});
//]]>
</script>
</head>
<body>
<input type='button' id='t' value='click me please' />
<div id='debug'>
</div>
</body>
</html>

 

 

http://dl.javaeye.com/upload/attachment/99583/d17689ea-7621-30ba-933e-aea40e0cd53e.png

 

 

转自:http://yiminghe.javaeye.com/blog/377549

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值