2017-2021年更新
自从2009年提出这个问题以来,JavaScript已经有了很大的发展.所有其他答案现在都已过时或过于复杂.以下是当前的最佳实践:
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
或者作为一句俏皮话:
await new Promise(r => setTimeout(r, 2000));
或
const sleep = ms => new Promise(r => setTimeout(r, ms));
将其用作:
await sleep(<duration>);
演示:
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function demo() {
for (let i = 0; i < 5; i++) {
console.log(`Waiting ${i} seconds...`);
await sleep(i * 1000);
}
console.log('Done');
}
demo();
请注意,
await
只能在以关键字async
为前缀的函数中执行,或者在脚本的顶层an increasing number of environments中执行.
await
仅暂停当前async
功能.这意味着它不会阻止脚本其余部分的执行,这在绝大多数情况下都是您想要的.如果您确实想要一个阻塞构造,请参阅this answer使用Atomics
.wait
,但请注意,大多数浏览器不允许在浏览器的主线程上使用它.
两个新的JavaScript功能(截至2017年)帮助编写了这个"睡眠"功能:
兼容性
如果出于某种原因,您使用的是7岁以上的 node (达到end of life in 2017),或者针对的是旧浏览器,那么async
/await
仍然可以通过Babel(一个将transpile个JavaScript+新功能转换为普通旧JavaScript的工具)和transform-async-to-generator
插件使用.