在JavaScript中,Java的Thread.sleep()相当于什么?

Nig*_*ger 165 javascript java

什么相当于Thread.sleep()JavaScript中的Java ?

Dan*_*den 194

简单的答案是没有这样的功能.

你最接近的是:

var millisecondsToWait = 500;
setTimeout(function() {
    // Whatever you want to do after the wait
}, millisecondsToWait);
Run Code Online (Sandbox Code Playgroud)

请注意,您特别不想忙等待(例如在旋转循环中),因为您的浏览器几乎肯定会在单线程环境中执行您的JavaScript.

以下是一些处理JavaScript中的线程的其他SO问题:

这个问题也可能有所帮助:

  • 为了促进良好的编码实践,最好在"500"之后插入一个分号并在代码示例中初始化"millisecondsToWait"(例如,在其前面加上"var")(这样,如果有人复制并粘贴样本,他们不会以隐含的全球结束). (7认同)
  • 抓得好,史蒂夫。我已经编辑了我的答案以反映您的评论。 (2认同)

Dav*_*iró 64

尝试使用此代码.我希望它对你有用.

function sleep(seconds) 
{
  var e = new Date().getTime() + (seconds * 1000);
  while (new Date().getTime() <= e) {}
}
Run Code Online (Sandbox Code Playgroud)

  • 这不会使线程进入休眠状态,它只会消耗线程,浪费的计算可能会阻止UI.不建议. (69认同)
  • 这是一个"忙碌的等待",也就是说你"在线" (13认同)
  • 对于我的单元测试目的,它很有用.当然,不是为了生产. (12认同)
  • 完全按照预期做的 (3认同)
  • “ thread.distract” (2认同)
  • 这是一个非常糟糕的主意。 (2认同)
  • @DaveNewton,是的,从资源使用的角度来看这是正确的,但从代码流执行的角度来看,这比模拟 thread.sleep() 时接受的答案更好。考虑网络工作人员处理其消息队列的情况,接受的答案会导致工作人员继续处理下一条消息,而上一条消息仍在等待超时回调。该线程在功能上并未休眠,因为它正在处理其他消息。这个答案实际上阻止了线程继续执行其他工作。 (2认同)

Ric*_*hrd 24

假设您能够使用ECMAScript 2017,则可以使用async/await和setTimeout模拟类似的行为.这是一个示例睡眠功能:

async function sleep(msec) {
    return new Promise(resolve => setTimeout(resolve, msec));
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在任何其他异步函数中使用sleep函数,如下所示:

async function testSleep() {
    console.log("Waiting for 1 second...");
    await sleep(1000);
    console.log("Waiting done."); // Called 1 second after the first console.log
}
Run Code Online (Sandbox Code Playgroud)

这很好,因为它避免了需要回调.缺点是它只能用于异步功能.在幕后,testSleep函数暂停,在睡眠完成后,它将恢复.

来自MDN:

await表达式导致异步函数执行暂停,直到Promise被完成或拒绝,并在执行后继续执行async函数.

有关完整说明,请参阅:

  • 2020 年也是如此:) (4认同)

Nic*_*ver 7

没有直接的等价物,因为它会暂停一个网页.但是有一个setTimeout(),例如:

function doSomething() {
  thing = thing + 1;
  setTimeout(doSomething, 500);
}
Run Code Online (Sandbox Code Playgroud)

关闭示例(感谢Daniel):

function doSomething(val) {
  thing = thing + 1;
  setTimeout(function() { doSomething(val) }, 500);
}
Run Code Online (Sandbox Code Playgroud)

第二个参数是触发前的毫秒,您可以将其用于时间事件或在执行操作之前等待.

编辑: 根据注释更新,以获得更清晰的结果.


Top*_*rak 7

对于最佳解决方案,请为 ecma 脚本 2017 使用 async/await 语句

await 只能在 async 函数内部使用

function sleep(time) {
    return new Promise((resolve) => {
        setTimeout(resolve, time || 1000);
    });
}

await sleep(10000); //this method wait for 10 sec.
Run Code Online (Sandbox Code Playgroud)

注意:async / await 并没有像 Thread.sleep 那样实际停止线程而是模拟它


Mal*_*eur 5

您可以编写一个自旋循环(一个仅长时间循环执行某种计算以延迟函数的循环)或使用:

setTimeout("Func1()", 3000);
Run Code Online (Sandbox Code Playgroud)

这将在 3 秒后调用“Func1()”。

编辑:

感谢评论者,但您可以将匿名函数传递给 setTimeout。

setTimeout(function() {
   //Do some stuff here
}, 3000);
Run Code Online (Sandbox Code Playgroud)

这样效率更高,并且不会调用 javascript 的 eval 函数。

  • 您不应该*永远*引用 setTimeout 的第一个参数 - 传递匿名函数或函数引用。更正后的版本为:setTimeout(Func1, 3000); (15认同)
  • (引用 setTimeout 的第一个参数不必要地调用“eval()”。) (4认同)
  • @Nick:不,如果你想传递参数,你可以使用闭包。 (2认同)