sleep() 的 JavaScript 版本是什么?

新手上路,请多包涵

有没有比下面的 sleep 函数( 取自这里)更好的在 JavaScript 中设计 pausecomp 的方法?

function pausecomp(millis)
{
    var date = new Date();
    var curDate = null;
    do { curDate = new Date(); }
    while(curDate-date < millis);
}

这不是 JavaScript 中 Sleep 的重复 - 动作之间的延迟;我想要在函数中间 _真正的睡眠_,而不是在一段代码执行之前的延迟。

原文由 fmsf 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

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 关键字为前缀的函数中执行,或者在 越来越多的环境 中在脚本的顶层执行。

  2. await 仅暂停当前的 async 功能。这意味着它不会阻止脚本其余部分的执行,这在绝大多数情况下都是您想要的。如果您确实需要阻塞构造,请使用 Atomics .wait 查看 此答案,但请注意,大多数浏览器不允许在浏览器的主线程上使用它。

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

兼容性

如果由于某种原因您使用的 Node 早于 7( 2017 年达到了生命周期),或者针对的是旧浏览器,仍然可以通过 Babel 使用 async / await (一种将 JavaScript + 新功能转换为普通旧功能的工具JavaScript),带有 transform-async-to-generator 插件。

原文由 Dan Dascalescu 发布,翻译遵循 CC BY-SA 4.0 许可协议

(请参阅 2016 年的更新答案

我认为想要执行一个动作,等待,然后再执行另一个动作是完全合理的。如果您习惯于使用多线程语言编写代码,您可能会有这样的想法:让执行一段时间,直到您的线程被唤醒。

这里的问题是 JavaScript 是一个单线程的基于事件的模型。虽然在特定情况下,让整个引擎等待几秒钟可能会很好,但通常这是不好的做法。假设我想在编写自己的函数时使用您的函数?当我调用你的方法时,我的方法将全部冻结。如果 JavaScript 可以以某种方式保留您的函数的执行上下文,将其存储在某个地方,然后将其取回并稍后继续,那么睡眠可能会发生,但这基本上是线程化的。

因此,您几乎无法接受其他人的建议——您需要将代码分解为多个函数。

那么,您的问题是一个错误的选择。没有办法以您想要的方式入睡,您也不应该追求您建议的解决方案。

原文由 Ben Flynn 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏