在Node.js中睡觉

2022-05-23 00:00:00 multithreading sleep node.js javascript

假设没有"本地"方法来实现这一点,我的解决方案类似于

sleep = function(time) {
        var stop = new Date().getTime();
        while(new Date().getTime() < stop + time) {
            ;
        }
        return new Promise((r,_)=> r())
      }

这样做sleep(1000*3).then(()=>console.log("awake"))它将休眠3秒,然后解析Promise

(请注意,它将在一秒钟内冻结此页面。)

数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">
sleep = function(time) {
  var stop = new Date().getTime();
  while (new Date().getTime() < stop + time) {;
  }
  return new Promise((r, _) => r())
}
console.log("sleeping...")
sleep(1000 * 1).then(() => console.log("awake"))

假设这将在主线程中运行,它将冻结主进程,以便

sleep(1000*1).then(()=>console.log("awake")); console.log("Hello")

它将导致输出

VM2628:1 Hello
VM2628:1 awake

在睡眠的最后时刻。当然要做

setTimeout(()=>sleep(1000*3).then(()=>console.log("awake")),1000);console.log("Hello")
VM2815:1 Hello
undefined
VM2815:1 awake

将使其成为异步的,但它不能满足我的需要(放到sleep我的主进程中)。 还有更好的办法吗?


解决方案

根本不需要冻结。由于Java脚本的异步性,我们可以将部分代码保留一段时间,稍后再继续。首先,我们需要一个有前途的计时器:

 const timer = ms => new Promise( res => setTimeout(res, ms));

然后我们可以简单地使用它:

console.log("wait 3 seconds")
timer(3000).then(_=>console.log("done"));

或加点语法糖:

(async function(){
  console.log("wait 3 seconds");
  await timer(3000);
  console.log("done");
})()

如果你真的想冻结(非常糟糕),你根本不需要承诺:

function freeze(time) {
    const stop = new Date().getTime() + time;
    while(new Date().getTime() < stop);       
}

console.log("freeze 3s");
freeze(3000);
console.log("done");

相关文章