有没有比下面的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的副本;我希望函数中间有real 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));

将其用作:

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();

请注意,

  1. await只能在以关键字async为前缀的函数中执行,或者在脚本的顶层an increasing number of environments中执行.
  2. 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插件使用.

Javascript相关问答推荐

Angular 17—每当一个布尔变量变为真时触发循环轮询,只要它保持为真

在Vite React库中添加子模块路径

在react js中使用react—router—dom中的Link组件,分配的右侧不能被 destruct ''

在服务器上放置了Create Reaction App Build之后的空白页面

更改预请求脚本中重用的JSON主体变量- Postman

如何在使用rhandsontable生成表时扩展数字输入验证?

从页面到应用程序(NextJS):REST.STATUS不是一个函数

创建以键值对为有效负载的Redux Reducer时,基于键的类型检测

TypeError:无法读取未定义的属性(正在读取';宽度';)

如何在Java脚本中对列表中的特定元素进行排序?

ComponentWillReceiveProps仍在React 18.2.0中工作

谷歌饼图3D切片

如何压缩图像并将其编码为文本?

Chart.js Hover线条在鼠标离开时不会消失

$GTE的mongoose 问题

React数组查找不读取变量

ReactJS在类组件中更新上下文

观察子组件中的@Output事件emits 器?

使用重新 Select 和对象理解 Select 器备忘

如何在不获取其子元素的文本内容的情况下获取元素的文本内容?