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()函數仍是最好的選擇。