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()函數仍是最好的選擇。
相關文章
相關標籤/搜索