什么是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的重复 - 动作之间的延迟; 我想在函数中间进行真正的睡眠,而不是执行一段代码之前的延迟。


2017更新

自2009年问这个问题以来,JavaScript已经发生了重大变化。 所有其他答案现在已经过时或过于复杂。 这是目前的最佳做法:

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function demo() {
  console.log('Taking a break...');
  await sleep(2000);
  console.log('Two second later');
}

demo();

就是这个。 await sleep(<duration>)

你可以在Runkit上试试这段代码。 注意,

  • await只能在以async关键字为前缀的函数中执行。 在执行它之前,Runkit将代码封装在异步函数中。
  • await暂停当前​​的async功能
  • 两个新的JavaScript功能帮助编写了这个实际的“睡眠”功能:

  • 承诺,ES2015的原生特征(又名ES6)。 我们还在睡眠函数的定义中使用箭头函数。
  • 即将到来的async/await功能让代码明确地等待承诺解决。
  • 兼容性

  • 承诺在Node v0.12 +中得到支持,并在浏览器中得到广泛支持,除了IE
  • async / await在V8登陆并且自Chrome 55以来默认启用
  • 它于2016年10月登陆节点7
  • 也已于2016年11月至11月期间在Firefox每晚登陆
  • 如果由于某种原因,您使用的节点年龄超过7岁,或者针对的是旧版浏览器,那么async / await仍然可以通过Babel(一种将JavaScript +新功能转换为普通旧JavaScript的工具)使用,同时使用transform-async-to-generator插件。 跑

    npm install babel-cli --save
    

    用以下方法创建.babelrc

    {
      "plugins": [
        "transform-async-to-generator",
      ]
    }
    

    然后运行你的代码

    node_modules/babel-cli/bin/babel-node.js sleep.js
    

    但是,如果您使用的是Node 7或更高版本,或者您的目标是现代浏览器,则不需要此操作。


    (请参阅2016年更新的答案)

    我认为想要执行一个动作,等待然后执行另一个动作是完全合理的。 如果您习惯于使用多线程语言编写代码,那么您可能会想到在您的线程唤醒之前让您执行一段时间。

    这里的问题是JavaScript是一个基于事件的单线程模型。 虽然在特定情况下,让整个引擎等待几秒钟可能会很好,但总的来说这是不好的做法。 假设我想在写我自己的时候使用你的功能? 当我调用你的方法时,我的方法都会冻结。 如果JavaScript可以以某种方式保存你的函数的执行上下文,将它存储在某个地方,然后将其还原并稍后继续,然后可以进行睡眠,但这基本上是线程化的。

    所以你几乎坚持别人的建议 - 你需要把你的代码分解成多个函数。

    那么你的问题有点错误选择。 没有办法以你想要的方式睡觉,也不应该追求你所建议的解决方案。


    在JavaScript中,我重写了每个函数,以便它可以尽快结束。 您希望浏览器重新进入控制状态,以便可以改变DOM。

    每次我在我的函数中想要一个睡眠时,我都会重构使用setTimeout()

    我要编辑这个答案,因为我发现这是有用的:

    臭名昭着的睡眠或延迟功能在任何语言中都有很多争论。 有人会说,应该总是有一个信号或回调来触发一个给定的功能,其他人会说有时候任意时刻的延迟都是有用的。 我说每个人都有自己的规则,一个规则决不能决定这个行业的任何东西。

    编写睡眠函数非常简单,使用JavaScript Promise更加实用:

    // sleep time expects milliseconds
    function sleep (time) {
      return new Promise((resolve) => setTimeout(resolve, time));
    }
    
    // Usage!
    sleep(500).then(() => {
        // Do something after the sleep!
    });
    
    链接地址: http://www.djcxy.com/p/16399.html

    上一篇: What is the JavaScript version of sleep()?

    下一篇: Is the source code of native methods available?