JavaScript技巧:实现 sleep()

meizz 2006-03-03 10:37:27

JavaScript是一个顺序解释性的语言,在网页里执行的时候往往想让它的执行暂停一下,但又没有对应的方法可用,于是就有人使用 N 万次的空循环来消耗时间,不过暂停是暂停了,但每台电脑对这个空循环的执行时间是不一样的,好的电脑可能只有零点几秒,但差的电脑就惨了,可能需要几秒甚至几十秒才能做完这些空操作,所以我特意修改了一下它的实现,可以达到定时量的暂停:

function sleep(n)
{
var start=new Date().getTime();
while(true) if(new Date().getTime()-start>n) break;
}

代码量不多,纯属于技巧卖弄而已,见笑了。
...全文
41643 56 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
56 条回复
切换为时间正序
请发表友善的回复…
发表回复
cuixiping 2010-06-13
  • 打赏
  • 举报
回复
通用的能阻塞脚本运行的,无外2种:
1、模式对话框:alert, prompt, confirm, showModalDialog(ie), msgbox(ie+vbs), inputbox(ie+vbs) 属于此类
2、ActiveX:XMLHTTP属于此类
S314324153 2010-05-31
  • 打赏
  • 举报
回复
没下文了?
madStone_l 2010-05-29
  • 打赏
  • 举报
回复
学习了~~!
r_swordsman 2010-05-27
  • 打赏
  • 举报
回复
....
r_swordsman 2010-05-27
  • 打赏
  • 举报
回复
....
r_swordsman 2010-05-27
  • 打赏
  • 举报
回复
....
luoyefudi 2006-05-15
  • 打赏
  • 举报
回复
买重了《javascript权威指南》,出售一本,特价!这本书,想必玩过javascrip的都略有耳闻的,很好的一本书,但我买了一本,我的一个朋友同时又给我买了,郁闷!现特价出售其中一本,原价是99元的,我现在只卖70!不说什么合算不合算了,希望与你交个朋友!反正大家都是搞程序的,如果能与你相识,相信也是缘分,对了,我在上海,最好能是在上海的朋友买到这本书,都比较方便,亲手交书,也好,免得大家不相信。可以联系我电话,13585892686 (希望先短信联系)。希望大家能给我问下,谁需要,谢谢
iasky 2006-05-15
  • 打赏
  • 举报
回复
MARK
zmm049 2006-05-15
  • 打赏
  • 举报
回复
怎么没有下文了?
secondflying 2006-05-15
  • 打赏
  • 举报
回复
收藏!
loveme4180 2006-04-26
  • 打赏
  • 举报
回复
好精彩,顶
laochake 2006-03-08
  • 打赏
  • 举报
回复
等我先泡杯茶。。。
hbhbhbhbhb1021 2006-03-08
  • 打赏
  • 举报
回复
ttyp的方法刚查了下
oServerXMLHTTPRequest.setTimeouts(resolveTimeout, connectTimeout,
sendTimeout, receiveTimeout);


Parameters
resolveTimeout


A long integer. The value is applied to mapping host names (such as "www.microsoft.com") to IP addresses; the default value is infinite, meaning no timeout.

connectTimeout


A long integer. The value is applied to establishing a communication socket with the target server, with a default timeout value of 60 seconds.

sendTimeout


A long integer. The value applies to sending an individual packet of request data (if any) on the communication socket to the target server. A large request sent to a server will normally be broken up into multiple packets; the send timeout applies to sending each packet individually. The default value is 30 seconds.

receiveTimeout


A long integer. The value applies to receiving a packet of response data from the target server. Large responses will be broken up into multiple packets; the receive timeout applies to fetching each packet of data off the socket. The default value is 30 seconds.

hbhbhbhbhb1021 2006-03-08
  • 打赏
  • 举报
回复
function sleep(timeNum)
{
window.setTimeout(writeNum,1000,timeNum);
num=num+parseInt(1);//这句没用,去掉!
}
</script>
TO meizz
我这样做是没有阻止主线程
期待xmlHttp的新版本
hbhbhbhbhb1021 2006-03-08
  • 打赏
  • 举报
回复
to JK
setTimeout是立即返回,是不能完全实现sleep那种,只是模拟,有点象。执行的时候不是有个延迟吗?动态的把延迟加大,也就是说每次执行的延迟时间不同。这样如果是在循环执行过程中的,就可以达到sleep的这个效果,比如
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>WaterFire</title>
</head>
<script language=javascript>
num=1;
var _st = window.setTimeout;
window.setTimeout = function(fRef,mDelay)
{
if (typeof fRef=="function")
{
if(arguments.length>2)
{
mDelay=parseInt(arguments[2])*parseInt(1000)+parseInt(mDelay);
return _st(fRef,mDelay)
}
}
return _st(fRef,mDelay);
}
function writeNum()
{
if(num==5)//执行第5次的时候调用sleep方法,延迟5秒执行
{
document.getElementById("div1").innerText=num+"这次延迟";
sleep(5);
}
else
{
document.getElementById("div1").innerText=num;
num=parseInt(num)+parseInt(1);
window.setTimeout("writeNum()",1000);
}

}
function sleep(timeNum)
{
window.setTimeout(writeNum,1000,timeNum);
num=num+parseInt(1);
}
</script>
<body onload=writeNum()>
<div id="div1">
 
</div>
</body>
</html>
hbhbhbhbhb1021 2006-03-07
  • 打赏
  • 举报
回复
整理了下思路,上面可能没表述清楚,
可以多传一个参数,然后判断第三个参数,如果满足一定的要求就把第二个参数调大。不满足则不变
meizz 2006-03-07
  • 打赏
  • 举报
回复
嗯,setTimeout 并没有达到sleep的功能,并没有阻止主程序的运行。sleep在某些特殊的场合下还是有些用处的,即然 xmlhttp 法是最优化的,那我再花点时间把这个功能代码优化一下再发布。
JK_10000 2006-03-07
  • 打赏
  • 举报
回复
本来是希望XMLHTTPRequest有一个setRequestTimeout(ms)的方法,
可惜的是没有。

另,to:hbhbhbhbhb1021(天外水火(我要多努力))
window.setTimeout方法是立即返回,
sleep应该是希望过一段时间再返回吧.

我也不觉得sleep有什么用处
编码这么多年,还没碰到过要用的情况呢
hbhbhbhbhb1021 2006-03-07
  • 打赏
  • 举报
回复
为什么不通过setTimeout函数啊?
既然传对象参数可以重载setTimeout函数,为什么不重载这个函数的第二个参数
把第二个参数调大,已达到sleep的目的。
JK_10000 2006-03-07
  • 打赏
  • 举报
回复
to: yjbnew
虽说比较耗cpu,但不至于多得成为耗cpu的主要原因
tempStr只是为了演示url与cpu耗用以及时间精度的关系
改一下url可以看到不同的cup耗用和不同的时间精度
如果把url定成google,好像有点对不起google。
如果把url定成一个不存在的url,精度就相当于变成request的timeout时间
如果把url定成about:blank,那这样只是耗掉自己的cup
。。。
加载更多回复(36)

87,997

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧