What's the equivalent of Java's Thread.sleep() in JavaScript?
JavaScript中Java的EDCOX1 0的等价物是什么?
简单的答案是没有这样的功能。
你拥有的最接近的东西是:
1 2 3 4 | var millisecondsToWait = 500; setTimeout(function() { // Whatever you want to do after the wait }, millisecondsToWait); |
请注意,您尤其不想忙于等待(例如在spin循环中),因为您的浏览器几乎肯定是在单线程环境中执行您的javascript。
这里还有几个其他的关于javascript中线程的so问题:
- javascript和线程
- 为什么javascript不支持多线程?
这个问题也可能有帮助:
- setTimeout-如何避免使用字符串进行回调?
尝试使用此代码。希望对你有用。
1 2 3 4 5 |
假设您能够使用EcmaScript 2017,那么您可以通过使用Async/Wait和SetTimeout来模拟类似的行为。下面是一个睡眠功能示例:
1 2 3 | async function sleep(msec) { return new Promise(resolve => setTimeout(resolve, msec)); } |
然后您可以在任何其他异步函数中使用sleep函数,如下所示:
1 2 3 4 5 | async function testSleep() { console.log("Waiting for 1 second..."); await sleep(1000); console.log("Waiting done."); // Called 1 second after the first console.log } |
这很好,因为它避免了需要回调。缺点是它只能在异步函数中使用。在后台,testsleep函数暂停,在睡眠完成后,它将恢复。
来自MDN:
The await expression causes async function execution to pause until a
Promise is fulfilled or rejected, and to resume execution of the async
function after fulfillment.
有关完整解释,请参阅:
- https://developer.mozilla.org/en-us/docs/web/javascript/reference/statements/async_函数
- https://developer.mozilla.org/en-us/docs/web/javascript/reference/operators/await
没有直接的等价物,因为它会暂停网页。但是有一个setTimeout(),例如:
1 2 3 4 | function doSomething() { thing = thing + 1; setTimeout(doSomething, 500); } |
关闭示例(感谢Daniel):
1 2 3 4 | function doSomething(val) { thing = thing + 1; setTimeout(function() { doSomething(val) }, 500); } |
第二个参数是触发前的毫秒数,您可以将其用于时间事件或在执行操作之前等待。
编辑:根据注释更新以获得更清晰的结果。
您可以编写一个自旋循环(一个长时间循环的循环,执行某种计算来延迟函数),也可以使用:
1 | setTimeout("Func1()", 3000); |
这将在3秒后调用"func1()"。
编辑:
这归功于评论者,但您可以通过匿名函数来设置超时。
1 2 3 | setTimeout(function() { //Do some stuff here }, 3000); |
这样做效率更高,并且不会调用javascript的eval函数。
为了获得最佳解决方案,请对ECMA脚本2017使用Async/Await语句
wait只能在异步函数内部使用
1 2 3 4 5 6 7 | function sleep(time) { return new Promise((resolve) => { setTimeout(resolve, time || 1000); }); } await sleep(10000); //this method wait for 10 sec. |
注意:async/await实际上不是像thread.sleep那样停止线程,而是模拟它
不管thread.sleep如何,setTimeout不会在自己的线程上保持和恢复。在javascript中没有实际相等的
或者可以使用setinterval函数,在指定的毫秒数之后调用特定的函数。谷歌搜索一下setinterval原型,我不太记得了。
这最终帮助了我:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | var x = 0; var buttonText = 'LOADING'; $('#startbutton').click(function(){ $(this).text(buttonText); window.setTimeout(addDotToButton,2000); }) function addDotToButton(){ x++; buttonText += '.'; $('#startbutton').text(buttonText); if (x < 4) window.setTimeout(addDotToButton, 2000); else location.reload(true); } |