有没有比下面的 pausecomp
函数 (taken from here) 在 JavaScript 中设计 sleep
更好的方法?
function pausecomp(millis)
{
var date = new Date();
var curDate = null;
do { curDate = new Date(); }
while(curDate-date < millis);
}
这不是 Sleep in JavaScript - delay between actions 的副本;我希望在函数中间有一个真正的 sleep ,而不是在一段代码执行之前的延迟。
最佳答案
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));
或在 typescript 中:
const sleep = (ms: number) => 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 年)帮助编写了这个“ sleep ”函数:
- Promises, a native feature of ES2015 (又名 ES6)。我们还使用 arrow functions在 sleep 函数的定义中。
async/await
该功能允许代码显式等待 promise 解决(解决或拒绝)。
兼容性
- 支持 promise in Node v0.12+和 widely supported in browsers , IE除外
async
/await
登陆V8,已经enabled by default since Chrome 55 (2016 年 12 月发布)
如果由于某种原因您使用的 Node 早于 7(达到 end of life in 2017),或者针对的是旧浏览器,async
/await
仍然可以使用通过 Babel (将 transpile JavaScript + 新功能转换为普通旧 JavaScript 的工具),带有 transform-async-to-generator
插件。
关于javascript - sleep() 的 JavaScript 版本是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/951021/