一尘不染

sleep()的JavaScript版本是什么?

javascript

是否有sleep比下面的pausecomp函数(从此处获取)更好的方法来设计JavaScript

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

这不是JavaScript中Sleep的重复-动作之间的延迟 ; 我希望在函数中间真正入睡,而不是在执行一段代码之前没有延迟。


阅读 356

收藏
2020-04-22

共1个答案

一尘不染

2017年— 2019年更新

自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 seconds later, showing sleep in a loop...');



  // Sleep in loop

  for (let i = 0; i < 5; i++) {

    if (i === 3)

      await sleep(2000);

    console.log(i);

  }

}



demo();

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

还是单线:

await new Promise(r => setTimeout(r, 2000));

注意,

  1. await只能在以async关键字为前缀的函数中执行,或者在某些环境中(例如Chrome DevTools控制台或Runkit)在脚本的顶层执行。
  2. await仅暂停当前async功能

两个新的JavaScript功能帮助编写了此“睡眠”功能:

  • Promises,是ES2015(又名ES6)的本机功能。我们还在睡眠功能的定义中使用了箭头功能。
  • 该async/await功能使代码可以明确地等待承诺的达成(解决或拒绝)。

兼容性

  • 诺言在Node v0.12 +中受支持,并且在浏览器(IE除外)中得到广泛支持
  • async/ await降落在V8中,自Chrome 55(于2016年12月发布) 以来已默认启用
  • 它于2016年10月降落在Node 7上
  • 并于2016年11月登陆Firefox Nightly
    如果你正在使用节点年纪比7(已经达成了一些奇怪的原因生命的尽头),或瞄准旧的浏览器,async/ await仍然可以通过使用巴别塔(一种工具,将transpile的JavaScript +新功能集成到普通的旧的JavaScript) ,带有transform-async-to-generator插件。
2020-04-22