js sleep函数怎么没有反应

JavaScript中是没有sleep命令的,通常情况下,可以使用现有的setTimeout(),clearTimeout()和setInterval()来完成,在这种情况下,你应该使用内置函数。但如果你真的需要有选项的sleep或等待语句,看看什么代码可以工作得最好。
sleep方法有什么要求呢?看看下面的权威描述最能说明问题:
暂停应用程序的当前线程,时间为指定的毫秒数,允许其他进程(或线程)继续运行。
  
下面是javascript实现sleep函数的各种方法:
(1)通过循环实现JavaScript sleep
(2)通过Java Applet实现JavaScript sleep
(3)通过Flash实现JavaScript sleep
(4)通过XMLHttp实现JavaScript sleep
  
通过循环实现JavaScript sleep
代码如下:
<script type= "text/javascript" >
// bad implementation
function  sleep(milliSeconds){    
     var  startTime =  new  Date().getTime();   // get the current time   
     while  ( new  Date().getTime() < startTime + milliSeconds);   // hog cpu
     }
  </script>    
我们使用一个 while 循环,在第3行,不断检测当前的时间,到时间了我们就停止循环。这个循环运行速度很快,浏览器将占用所有宝贵的CPU资源。检查时间可能看起来并不多,但每秒做数千次(或几万),使您的计算机上性能受到影响。
通过Java Applet实现JavaScript sleep
这个解决方案是插入一个Java Applet,通过Javascript和java applets进行通讯,Java Applets使用Java的Thread.sleep()方法休眠线程(不占用资源)。
<applet code= "DevCheater.class"  name= "devCheater"  id= "devCheater"  mayscript= "true"  height= "1"  width= "1" >
</applet> 
<script type= "text/javascript" >     
     function  sleep(milliSeconds){        
     // runs Java Applets sleep method        
     document.devCheater.sleep(milliSeconds);     
    
</script>    
此方法不冻结所有页面中的其他javascript(使用Chrome时除外)。不幸的是,它需要安装一个Java插件。
通过Flash实现JavaScript sleep
如果我们尝试了Java,为什么不试试ADOBE FLASH。我创建了一个Flash应用程序,有一个方法叫flashSleep()。我使用javascript调用我的flash方法,并传入需要sleep的毫秒数。但不幸的是,这种方法在大多数的浏览器中也导致了阻塞。
<script type= "text/javascript" >     
     function  sleep(milliSeconds){        
         // call sleep method in flash        
         getFlashMovie( "flashSleep" ).flashSleep(milliSeconds);    
     }     
     function  getFlashMovie(movieName){        
     // source: http://kb2.adobe.com/cps/156/tn_15683.html        
     var  isIE = navigator.appName.indexOf( "Microsoft" ) != -1;        
     return  (isIE) ? window[movieName] : document[movieName];    
    
  </script>    
   <object classid= "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"  codebase= "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0"  width= "50"  height= "50"  id= "flashSleep"  align= "middle" >
   <param name= "allowScriptAccess"  value= "sameDomain"  />
   <param name= "allowFullScreen"  value= "false"  />
   <param name= "movie"  value= "flashSleep.swf"  />
   <param name= "quality"  value= "high"  /><param name= "bgcolor"  value= "#ffffff"  />  <embed src= "flashSleep.swf"  quality= "high"  bgcolor= "#ffffff"  width= "50"  height= "50"  name= "flashSleep"  align= "middle"  allowScriptAccess= "sameDomain"  allowFullScreen= "false"  type= "application/x-shockwave-flash"  pluginspage= "http://www.macromedia.com/go/getflashplayer"  />
   </object>    
测试发现,Flash也不是理想的方式。
通过XMLHttp实现JavaScript sleep
另一种方法是使用XMLHttp进行服务器通信。
<script type= "text/javascript"
     function  sleep(milliSeconds){    
         var  resource;    
         var  response;    
         if ( typeof  ActiveXObject ==  'undefined' ){        
             resource =  new  XMLHttpRequest();    
         }    
         else {        
             // IE        
             resource =  new  ActiveXObject( "Microsoft.XMLHTTP" );    
        }     
        try {        
            resource.open( 'GET' 'sleep.php?milliSeconds='  + milliSeconds,  false );        
            resource.send( null );        
            response = resource.responseText;  // JavaScript waits for response            }catch(e){        
                alert(e);    
           }         
           return  true ;}     
  </script>    
  <?PHP    
      $milliSeconds = intval($_REQUEST[ 'milliSeconds' ]);    
      if ($milliSeconds > 60*1000){        
          // limit server abuse       
           $milliSeconds = 10;    
      }         
     usleep($milliSeconds * 1000);  // note: usleep is in micro seconds not milli    echo "done";
?>    
该方法并不占用用户计算机的CPU资源,但加重了服务器额外的负载。而且该方法阻塞了浏览器中其它javascript,对于服务器来说产生了类似DDos的攻击。
结论
从测试数据来看,许多的实现都有一定的副作用,所以setTimeout()或setInterval()函数还是最好的选择。


转载于:https://my.oschina.net/u/1866821/blog/338180

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值