javascript - sleep() 的 JavaScript 版本是什么?

标签 javascript sleep

有没有比下面的 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();

请注意,

  1. await 只能在以 async 关键字为前缀的函数中执行,或者在 an increasing number of environments 中的脚本顶层执行.
  2. await 只暂停当前的 async 函数。这意味着它不会阻止脚本其余部分的执行,这在绝大多数情况下都是您想要的。如果您确实需要阻塞结构,请参阅 this answer使用 Atomics .wait,但请注意,大多数浏览器不允许在浏览器的主线程上使用它。

两个新的 JavaScript 特性(截至 2017 年)帮助编写了这个“ sleep ”函数:

兼容性

如果由于某种原因您使用的 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/

相关文章:

javascript - 将 Javascript 与 HTML 分开

c++ - 带取消功能的准确 sleep

C、rand 函数不能与 sleep() 函数一起正常工作

java - 在 Android 中降低 GUI 的速度

Android 在收到短信时唤醒并通知

javascript - UiKit Grid、Margin 和 Cover 不能在 html 上工作是通过 ajax 加载的

javascript - JQuery click() 未触发

javascript - 使用 jQuery .load() 将一个页面的脚本部分加载到另一个页面中

javascript - 隐藏/显示 PHP 生成表单的按钮

c++ - EnterCriticalSection死锁