0

我想编写一个运行时间非常接近 5 秒的 javascript 函数。我怎样才能做出这样的保证?

我试过了

  function wait(numSeconds) {
    var end = new Date().getMilliseconds() + numSeconds * 1000;
    while (new Date().getMilliseconds() <= end) {}
  }

但这只会使页面崩溃。

4

6 回答 6

4

您不能在不冻结页面的情况下冻结页面。

您正在尝试编写一个连续运行 5 秒的函数。
Javascript 在 UI 线程上运行,因此无论何时运行任何代码,页面都会被冻结。

简而言之,你不能那样做。
您需要编写异步代码,可能使用setTimeout().

于 2013-05-29T21:16:56.480 回答
3

您可以使用:

var t = setTimeout(function(){alert('done')},5000);
于 2013-05-29T21:17:51.050 回答
2

如果您想在做某事之前等待 5 秒,请使用setTimeout 或 setInterval。否则,仅仅占用用户时间是个坏主意。事实上,如果执行某件事的时间过长,浏览器会中断您的脚本,而您的函数肯定会这样做。

于 2013-05-29T21:17:55.213 回答
2

(暂时忽略为什么你不应该真的这样做......)

您的代码冻结浏览器的原因是您的while条件永远不会变为真(对于numSeconds1 或更多)。

.getMilliseconds()方法返回日期的毫秒部分,即 0 到 999 之间的数字。对于numSeconds1 或更多,您end将始终大于 999。

尝试使用.getTime()而不是.getMilliseconds(). 或者,如果您不关心支持旧浏览器使用Date.now().

于 2013-05-29T21:27:24.953 回答
1

您可以只使用 javascripts setTimeout 而不是您自己的等待函数。

setTimeout 在一定时间后执行函数。

例如:

setTimeout(function(){}, 5000);

只需等待 5 秒钟。

在w3schools上查看更多信息。

于 2013-05-29T21:23:34.680 回答
1

严格来说,您所要求的无法完成,因为如您所见,页面将在您等待时冻结。

但是,实际上,我怀疑您真正想要的是这样的东西:

function waitawhile() {
    setTimeout( function() {
        alert('5 seconds has passed');
    }, 5000);
}
于 2013-05-29T21:24:32.787 回答