在Javascript中sleep()

nom*_*ind 14 javascript html5 modal-dialog blocking

假设我想在一定时间内阻止Javascript执行出于某种奇怪的原因,我该怎么做呢.JS中没有sleep().请不要说做while()循环,因为那很糟糕.我可以做一个window.showModalDialog并在一个非常小的时间的setTimeout的模态对话框中放置一个window.close,这样用户就不会注意到该对话框.这就像睡眠一段时间,如果需要我可以多次调用.还有其他方法吗?

详细说明,我的用例是HTML5 SQL数据库已经给出了异步api,但我想将它用于一个小商店永远不会大的小型webapp.因此不需要异步api,因为小商店上的查询将在客户端运行.所以我想编写一个带有sync api的ORM,以便开发人员可以更轻松地使用它.要将此异步桥接到同步api,我需要像睡眠这样的东西.

Rus*_*Cam 14

window.setTimeout或者window.setInterval几乎是你唯一的朋友.

如何使用setTimeout递归调用设置另一个超时的函数的示例如下

function go() {
    if (go.count < 4) {
        // logs 1, 2, 3 to firebug console at 1 second intervals
        console.log(go.count++);
        window.setTimeout(go, 1000);
    }
}
go.count = 1;

go();
Run Code Online (Sandbox Code Playgroud)

window.clearTimeout如果需要在完成之前清除超时,可以选择捕获要使用的timeoutID .

请注意,既不阻止window.setTimeout也不window.setInterval阻止其他脚本的执行 - 我不相信这是可能的JavaScript当前的幌子.有些方法可以编码来模仿UI阻塞,例如使用showModalDialog或拥有一些全局blocking布尔值,这些布尔值几乎可以让我害怕.

  • 我投了票.仅仅因为它的问题并不意味着它不是答案.这个答案说"几乎是你唯一的朋友",它提供了更多关于可以使用的数据并引入了新功能. (7认同)
  • 这已经在问题:) (4认同)

pka*_*ing 9

@Russ Cam是正确的,setTimeout是你在寻找的.但是,你在问题中提到它的方式让我觉得可能会对如何使用它感到困惑.

它不会阻止它所处的块的执行,而是在一定的时间间隔后调用它的输入函数.作为说明:

function illustration() {
  // start out doing some setup code
  alert("This part will run first");

  // set up some code to be executed later, in 5 seconds (5000 milliseconds):
  setTimeout(function () {
    alert("This code will run last, after a 5 second delay")
  }, 5000);

  // This code will run after the timeout is set, but before its supplied function runs:
  alert("This will be the second of 3 alert messages to display");
}
Run Code Online (Sandbox Code Playgroud)

运行此功能时,您将看到三条警报消息,第二个和第三个之间有延迟:

  1. "这部分将首先运行"
  2. "这将是显示3条警报信息中的第二条"
  3. "此代码将在延迟5秒后运行最后一次"


sel*_*oup 6

澄清一下:问题是在一段时间内完全停止脚本执行,而不是延迟执行某些代码,这对于setTimeout或setInterval来说是一项任务.

一个干净的sleep()实现是不可能的,在JavaScript中也是不可取的.

setTimout和setInterval不会停止脚本执行,就像这里的一些人看起来顶级思考.刚刚注册了一个推迟运行的函数.超时/间隔等待时,脚本的其余部分将继续运行.

由于JavaScript的异步性质,"阻止"任何代码执行的唯一方法是非常难看且绝对不推荐的while循环运行一段时间.因为JavaScript本身在一个单独的线程中运行(我们这里不讨论WebWorkers API ......).这将阻止任何JS代码运行,直到该循环结束.但那真是糟糕的风格......

如果您的程序无法在没有睡眠()的情况下工作,也许您应该重新考虑您的方法.