JavaScript在继续之前休眠/等待

use*_*460 296 javascript jquery sleep delay wait

我有一个JavaScript代码,我需要添加一个睡眠/等待功能.我正在运行的代码已经在一个函数中,例如:

function myFunction(time)
{
    alert('time starts now');
    //code to make the program wait before continuing
    alert('time is up')
}
Run Code Online (Sandbox Code Playgroud)

我听说可能的解决方案可能包括

setTimeout
Run Code Online (Sandbox Code Playgroud)

但我不知道如何在这种情况下使用它.

我不能使用PHP,因为我的服务器不支持它,虽然使用jQuery会很好.

BeN*_*ErR 548

JS没有sleep函数,它有setTimeout()setInterval()函数.

如果您可以将暂停后需要运行的代码移动到setTimeout()回调中,则可以执行以下操作:

//code before the pause
setTimeout(function(){
    //do what you need here
}, 2000);
Run Code Online (Sandbox Code Playgroud)

看这里的例子:http://jsfiddle.net/9LZQp/

这不会停止脚本的执行,但只要setTimeout()是异步函数,就是这段代码

console.log("HELLO");
setTimeout(function(){
    console.log("THIS IS");
}, 2000);
console.log("DOG");
Run Code Online (Sandbox Code Playgroud)

将在控制台中打印:

HELLO
DOG
THIS IS
Run Code Online (Sandbox Code Playgroud)

(请注意,在之前打印DOG)


您可以使用以下代码在短时间内模拟睡眠:

function sleep(milliseconds) {
  var start = new Date().getTime();
  for (var i = 0; i < 1e7; i++) {
    if ((new Date().getTime() - start) > milliseconds){
      break;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果你想睡一秒钟,只需使用:

sleep(1000);
Run Code Online (Sandbox Code Playgroud)

例如:http://jsfiddle.net/HrJku/1/

请注意,此代码将使您的脚本忙碌n毫秒.这不仅会停止在您的页面上执行Javascript,而且取决于浏览器的实现,可能会使页面完全无响应,并可能使整个浏览器无响应.换句话说,这几乎总是错误的做法.

  • 你好!这是一个繁忙的等待循环.当然,这不是公认的答案. (78认同)
  • `setTimeout()`涉及回调,这意味着它是异步的.OP要求停止的东西,这是同步的并且会导致中断. (26认同)
  • 我正在寻找一个繁忙的循环用于调试目的,所以即使这不是在生产环境中使用,它正是我正在寻找的. (25认同)
  • 它会冻结浏览器,如果你"睡眠"超过10秒,浏览器会显示警告:`此页面上的脚本可能正忙,或者它可能已停止响应.您可以立即停止脚本,在调试器中打开脚本,或者让脚本继续运行. (22认同)
  • 这会锁定浏览器,是CPU密集型的,如果暂停时间过长,会导致移动设备上的执行中断 (8认同)
  • @BeNdErR,使用无限循环,你永远不会达到最后的'i'值.我用`<1e7`测试`for`循环,在Chrome中花了不到20秒.所以,我认为,最好使用无限循环或`<Number.MAX_VALUE`. (3认同)
  • -1可怕的是,这是一个繁忙的循环睡眠功能.可怕的是,有30人为此+1了.我希望未来的读者可以阅读一年后添加的setTimeout示例. (3认同)
  • 这完全是一个有效的接受答案,因为它回答了这个问题.我在浏览器自动化的环境中找到了它,将整个UI暂停1秒钟就完全没问题了.同样重要的是要强调答案,以确保人们了解实际问题是什么,以及已经完成的答案的结果. (3认同)
  • ```function wait(ms) { const start = Performance.now(); while(performance.now() - 开始 &lt; 毫秒); }``` (3认同)
  • @BeNdErR,最好用`while(true)`而不是`for(..)`来使用无限循环.这样您的页面即使有很大的延迟也会响应. (2认同)
  • 我还要说,并不是所有的JS都是客户端,并且在某些特定情况下,当与外部API进行联系时,需要等待。我现在正在处理一个查询,该查询将POST发送到API,然后该API返回一个URL,但是在URL的报告中生成的实际数据可能最多需要三秒钟。因此,当他们想要该报告时,我正在使用忙循环。GG回答实际的问题@BeNdErR (2认同)