JavaScript sleep/wait before continuing
我有一个javascript代码需要添加一个sleep/wait函数。我正在运行的代码已经在函数中,例如:
1 2 3 4 5 6
| function myFunction(time)
{
alert('time starts now');
//code to make the program wait before continuing
alert('time is up')
} |
我听说可能的解决办法包括
但我不知道如何在这种情况下使用它。
我不能使用PHP,因为我的服务器不支持它,尽管使用jquery会很好。
- 代码应该是setTimeout(function(){ alert('time is up')},time);(而不是下面的\` line and the 警告行),时间以毫秒为单位developer.mozilla.org/en-us/docs/web/api/window.settimeout。
- 你为什么要让你的脚本等待?
- 谢谢大家。是否可以创建一个函数sleepnow(time),您可以在脚本中调用它,例如sleepnow(5000)到sleep 5秒?
- 函数sleep(_ms=0)var _start=new date().gettime();while(_ms>(new date().gettime()-_start))
JS没有sleep函数,它有setTimeout()或setInterval()函数。
如果可以将暂停后需要运行的代码移到setTimeout()回调中,则可以执行如下操作:
1 2 3 4
| //code before the pause
setTimeout(function(){
//do what you need here
}, 2000); |
请参阅以下示例:http://jsfiddle.net/9lzqp/
这不会停止脚本的执行,但是只要setTimeout()是一个异步函数,这个代码
1 2 3 4 5
| console.log("HELLO");
setTimeout(function(){
console.log("THIS IS");
}, 2000);
console.log("DOG"); |
将在控制台中打印:
(请注意,在此之前已打印狗)
可以使用以下代码模拟短时间睡眠:
1 2 3 4 5 6 7 8
| function sleep(milliseconds) {
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++) {
if ((new Date().getTime() - start) > milliseconds){
break;
}
}
} |
现在,如果您想睡眠1秒钟,只需使用:
示例:http://jsfiddle.net/hrjku/1/
请注意,此代码将使脚本保持N毫秒的繁忙状态。这不仅会停止页面上的javascript执行,而且根据浏览器的实现,可能会使页面完全无响应,并可能使整个浏览器无响应。换句话说,这几乎总是错误的。
- 它会冻结浏览器,如果您执行sleep操作超过10秒,浏览器会显示警告:A script on this page may be busy, or it may have stopped responding. You can stop the script now, open the script in the debugger, or let the script continue.。
- JS是单线程的。使用较短的时间或者找到另一种涉及设置超时功能的方法。请看:stackoverflow.com/questions/8624427/&hellip;
- 你好!这是一个繁忙的等待循环。当然,这不是公认的答案。
- 我需要一个阻塞睡眠来测试错误是否是由于耗时的任务或执行异步调用返回应用程序流造成的。最终,我的程序将不包括这个函数,但它将帮助我调试。
- 这会锁定浏览器,CPU密集型,如果暂停时间过长,会导致移动设备上的执行中断。
- setTimeout()涉及回调,这意味着它是异步的。操作请求停止的东西,它是同步的,并且会导致中断。
- @Benderr,最好用带while(true)的无限循环代替for(..)。这样即使有很大的延迟,您的页面也会响应。
- @伊万兹,你能解释一下为什么while会比for在大的延误上做出更好的反应吗?
- @Benderr,使用无限循环,您将永远无法达到最后一个"i"值。我用< 1e7测试了for环路,它在铬中的时间不到20秒。所以,我认为,最好使用无限循环或< Number.MAX_VALUE。
- -1可怕的是,这从一个繁忙循环的睡眠功能开始。可怕的是,30个人有+1'd这个。我希望未来的读者继续阅读一年后添加的settimeout示例。
- 我在寻找一个用于调试的繁忙循环,所以即使这不打算在生产环境中使用,它也正是我所寻找的。
- 这是一个完全可以接受的答案,因为它回答了这个问题。我是在浏览器自动化的环境中发现的,暂停整个用户界面一秒钟完全可以。强调答案也很重要,以确保人们了解实际问题是什么以及这个答案的结果,这已经完成了。
- 最好调用方法"blockingsleep",以避免诱惑人们在错误的上下文中使用它。有点像react.js的危险的lysentinerhtml。
- 我还将说,并不是所有的JS都是客户端的,并且在某些特定的情况下,当接触到外部API时,需要等待。我现在正在研究一种方法,在这种方法中,查询被发布到API,然后API返回一个URL,但是在该URL的报告中生成的实际数据可能需要3秒钟。所以,当他们想要那个报告时,我使用的是忙循环。回答本德的实际问题
- @SamuelTulach,编辑文章包括你自己的软件库,会被认为是垃圾邮件,阅读如何不成为一个垃圾邮件制造者,以防止在未来发生这种情况。
- function wait(ms) { const start = performance.now(); while(performance.now() - start < ms); }