在Javascript中的sleep()
在Javascript中的sleep()
这个问题已经有答案了:
假设我因为某些奇怪的原因想要阻止JavaScript执行一段时间,我该如何做到这一点。JS中没有sleep()函数。请不要说使用while()循环,因为那样做不好。我可以使用window.showModalDialog,在模态对话框中使用一个极短时间的setTimeout并在其中放置一个window.close,以便用户不会注意到对话框。这将类似于小时间段的sleep,并且如果需要,我可以多次调用它。还有其他方法吗?
更具体地讲,我的用例是HTML5 SQL Database提供了异步api,但我想在一个小型webapp中使用它,因为存储将永远不会很大。因此,不需要异步api,因为小型存储的查询将在客户端上运行。因此,我想编写一个带有同步api的ORM,以便开发人员可以更轻松地使用它。为了将这种异步转换为同步api,我需要类似于sleep的东西。
@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"); }
当你运行这个函数时,你将看到三个警告消息,第二个和第三个之间有一个延迟:
- “这部分将首先运行”
- “这将是要显示的3个警告消息中的第二个”
- “这段代码将在5秒延迟后运行最后”
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();
如果需要在超时结束之前清除超时,可以选择捕获timeoutID使用window.clearTimeout
。
请注意,window.setTimeout
和window.setInterval
都不会阻塞其他脚本的执行——我不认为这在JavaScript的当前状态下是可能的。有些方法可以编码以模拟UI阻塞,例如使用showModalDialog
或具有一些全局的blocking
布尔值,但这大概就是你可以得到的了。抱歉。