【问题标题】:Sleep in Node.js在 Node.js 中休眠
【发布时间】:2018-04-06 20:21:11
【问题描述】:

假设没有“本机”方法来实现这一点,我的解决方案是

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

这样做sleep(1000*3).then(()=&gt;console.log("awake"))会休眠3秒然后解析Promise

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

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我的主要进程)。 有更好的方法吗?

【问题讨论】:

  • 为什么要冻结你的 JS 解释器 3 秒?为什么不像该语言设计的那样只进行异步编程,而不必冻结任何东西?

标签: javascript node.js multithreading sleep


【解决方案1】:

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

 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");

【讨论】:

    【解决方案2】:
    function sleep(time, func){
        if (typeof func === 'function'){
            const timer = ms => new Promise( res => setTimeout(res, ms));
            timer(time).then(i=>func());
        }
        else{
            console.log('What about the function bro?')
        }
    }
    sleep(1000, function(){
        console.log('hello')
        console.log('test')
        var arr = [1,2,3,4]
        arr.forEach(i => console.log(i))
    })
    

    【讨论】:

      猜你喜欢
      • 2018-07-31
      • 2015-07-07
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多