文档章节

js sleep函数怎么没有反应

Carl_
 Carl_
发布于 2014/10/28 16:42
字数 841
阅读 39
收藏 0
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()函数还是最好的选择。


本文转载自:http://zhidao.baidu.com/link?url=2tS7rs2NKm0QQd6ZSGGvHUGdxFBsMRdRZNN7Sr1nFlP_bytUMCMu3I-FmIjzSIjw...

Carl_
粉丝 40
博文 387
码字总数 12168
作品 0
广州
私信 提问
Nodejs系列文章之:javascript代码进阶篇

作者: RobanLee (Code maker, PHP,JS,NODEJS,PYTHON, blog:http://my.oschina.net/robanlee) javascript & nodejs 一些进阶知识: 1. 如何快速进行string => int 的转换? 大家一般首先想到的就......

_dedecms
2014/05/07
0
2
JavaScript 原型的深入指南

摘要: 理解prototype。 原文:JavaScript 原型的深入指南 作者:前端小智 Fundebug经授权转载,版权归原作者所有。 不学会怎么处理对象,你在 JavaScript 道路就就走不了多远。它们几乎是 ...

Fundebug
04/24
0
0
原生javascript学习:javascript闭包实例

之前看zakas的Professional JavaScript,读过闭包的章节,当时觉得理论上是理解了,把书上的案例都实践了一遍。但例子是纯粹控制台调试实现的,印象不深刻,今天练习原生javascript的时候碰上...

黎宇浩
2012/06/15
0
0
【译】理解Javascript函数执行—调用栈、事件循环、任务等

原文作者:Gaurav Pandvia 原文链接:medium.com/@gaurav.pan… 文中部分链接可能需要梯子。 欢迎批评指正。 现如今,web开发者(我们更喜欢被叫做前端工程师)用一门脚本语言就能做任何事情...

👊Badd
2018/12/25
0
0
《JavaScript DOM 编程艺术》第2章:函数与对象

《JavaScript学徒》系列会以经典书籍为教材制作影片,和大家一起学习JavaScript。 本文同步发表于我的个人网站:ZackLive 这是《JavaScript学徒》系列的第三课,本课会继续《JavaScript DOM ...

ZackLive
2018/08/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Angular 英雄编辑器

应用程序现在有了基本的标题。 接下来你要创建一个新的组件来显示英雄信息并且把这个组件放到应用程序的外壳里去。 创建英雄组件 使用 Angular CLI 创建一个名为 heroes 的新组件。 ng gener...

honeymoose
今天
5
0
Kernel DMA

为什么会有DMA(直接内存访问)?我们知道通常情况下,内存数据跟外设之间的通信是通过cpu来传递的。cpu运行io指令将数据从内存拷贝到外设的io端口,或者从外设的io端口拷贝到内存。由于外设...

yepanl
今天
6
0
hive

一、hive的定义: Hive是一个SQL解析引擎,将SQL语句转译成MR Job,然后再在Hadoop平台上运行,达到快速开发的目的 Hive中的表是纯逻辑表,就只是表的定义,即表的元数据。本质就是Hadoop的目...

霉男纸
今天
5
0
二、Spring Cloud—Eureka(Greenwich.SR1)

注:本系列文章所用工具及版本如下:开发工具(IDEA 2018.3.5),Spring Boot(2.1.3.RELEASE),Spring Cloud(Greenwich.SR1),Maven(3.6.0),JDK(1.8) Eureka: Eureka是Netflix开发...

倪伟伟
昨天
15
0
eclipse常用插件

amaterasUML https://takezoe.github.io/amateras-update-site/ https://github.com/takezoe/amateras-modeler modelGoon https://www.cnblogs.com/aademeng/articles/6890266.html......

大头鬼_yc
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部