我想编写一个运行时间非常接近 5 秒的 javascript 函数。我怎样才能做出这样的保证?
我试过了
function wait(numSeconds) {
var end = new Date().getMilliseconds() + numSeconds * 1000;
while (new Date().getMilliseconds() <= end) {}
}
但这只会使页面崩溃。
我想编写一个运行时间非常接近 5 秒的 javascript 函数。我怎样才能做出这样的保证?
我试过了
function wait(numSeconds) {
var end = new Date().getMilliseconds() + numSeconds * 1000;
while (new Date().getMilliseconds() <= end) {}
}
但这只会使页面崩溃。
您不能在不冻结页面的情况下冻结页面。
您正在尝试编写一个连续运行 5 秒的函数。
Javascript 在 UI 线程上运行,因此无论何时运行任何代码,页面都会被冻结。
简而言之,你不能那样做。
您需要编写异步代码,可能使用setTimeout()
.
您可以使用:
var t = setTimeout(function(){alert('done')},5000);
如果您想在做某事之前等待 5 秒,请使用setTimeout 或 setInterval。否则,仅仅占用用户时间是个坏主意。事实上,如果执行某件事的时间过长,浏览器会中断您的脚本,而您的函数肯定会这样做。
(暂时忽略为什么你不应该真的这样做......)
您的代码冻结浏览器的原因是您的while
条件永远不会变为真(对于numSeconds
1 或更多)。
该.getMilliseconds()
方法仅返回日期的毫秒部分,即 0 到 999 之间的数字。对于numSeconds
1 或更多,您end
将始终大于 999。
尝试使用.getTime()
而不是.getMilliseconds()
. 或者,如果您不关心支持旧浏览器使用Date.now()
.
您可以只使用 javascripts setTimeout 而不是您自己的等待函数。
setTimeout 在一定时间后执行函数。
例如:
setTimeout(function(){}, 5000);
只需等待 5 秒钟。
在w3schools上查看更多信息。
严格来说,您所要求的无法完成,因为如您所见,页面将在您等待时冻结。
但是,实际上,我怀疑您真正想要的是这样的东西:
function waitawhile() {
setTimeout( function() {
alert('5 seconds has passed');
}, 5000);
}