【发布时间】:2010-11-29 15:56:24
【问题描述】:
Java 中的 Thread.sleep() 相当于 JavaScript 中的什么?
【问题讨论】:
标签: java javascript
Java 中的 Thread.sleep() 相当于 JavaScript 中的什么?
【问题讨论】:
标签: java javascript
假设您能够使用 ECMAScript 2017,您可以通过使用 async/await 和 setTimeout 来模拟类似的行为。这是一个示例睡眠函数:
async function sleep(msec) {
return new Promise(resolve => setTimeout(resolve, msec));
}
然后您可以在任何其他异步函数中使用 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
}
这很好,因为它避免了需要回调。缺点是它只能用于异步函数。在后台,testSleep 函数被暂停,并在睡眠完成后恢复。
来自 MDN:
await 表达式导致异步函数执行暂停,直到 承诺被履行或拒绝,并恢复异步执行 完成后的功能。
完整解释见:
【讨论】:
为获得最佳解决方案,请对 ecma 脚本 2017 使用 async/await 语句
await 只能在异步函数内部使用
function sleep(time) {
return new Promise((resolve) => {
setTimeout(resolve, time || 1000);
});
}
await sleep(10000); //this method wait for 10 sec.
注意:async / await 实际上并没有像 Thread.sleep 那样停止线程,而是模拟它
【讨论】:
setTimeout 不会在您自己的线程上保持和恢复,但是 Thread.sleep 会。 Javascript 中没有真正的相等
【讨论】:
这最终帮助了我:
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);
}
【讨论】:
试试这个代码。希望对你有用。
function sleep(seconds)
{
var e = new Date().getTime() + (seconds * 1000);
while (new Date().getTime() <= e) {}
}
【讨论】:
或者您可以使用 setInterval 函数,在指定的毫秒数后调用特定函数。 google一下setInterval原型就好了。我不太记得了。
【讨论】:
简单的回答是没有这个功能。
你拥有的最接近的东西是:
var millisecondsToWait = 500;
setTimeout(function() {
// Whatever you want to do after the wait
}, millisecondsToWait);
请注意,您尤其是不想忙着等待(例如在自旋循环中),因为您的浏览器几乎肯定会在单线程环境中执行您的 JavaScript。
以下是其他几个处理 JavaScript 线程的 SO 问题:
这个问题也可能有帮助:
【讨论】:
yield 可以用来“模拟”线程。有关示例库,请参阅 taskjs.org。
您可以编写一个自旋循环(一个循环很长一段时间的循环,执行某种计算以延迟函数)或使用:
setTimeout("Func1()", 3000);
这将在 3 秒后调用“Func1()”。
编辑:
功劳归评论者所有,但您可以将匿名函数传递给 setTimeout。
setTimeout(function() {
//Do some stuff here
}, 3000);
这样效率更高,并且不会调用 javascript 的 eval 函数。
【讨论】:
没有直接的等价物,因为它会暂停网页。但是有一个setTimeout(),例如:
function doSomething() {
thing = thing + 1;
setTimeout(doSomething, 500);
}
闭包示例(感谢 Daniel):
function doSomething(val) {
thing = thing + 1;
setTimeout(function() { doSomething(val) }, 500);
}
第二个参数是触发前的毫秒数,您可以将其用于时间事件或在执行操作之前等待。
编辑:基于 cmets 更新以获得更清晰的结果。
【讨论】: