javascript 在Node.js中睡眠

5q4ezhmt  于 12个月前  发布在  Java
关注(0)|答案(3)|浏览(106)

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

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
(be知道它将冻结此页面一秒。

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,但它没有解决我的需要(将我的主进程放入sleep)。有更好的办法吗?

**[更新]**承诺版本

/**
 * Sleep for time [msec]
 * @param time int milliseconds
 * @return Promise delayed resolve
 * @usage
    sleep(1000*3).then(()=>console.log("awake"))
 */
sleepP: function (time) {
  return new Promise((resolve, reject) => {
    var stop = new Date().getTime();
    while (new Date().getTime() < stop + time) {
      ;
    }
    return resolve(true)
  });
}

可以被称为

await sleepP( 1000 * 3 );
uurity8g

uurity8g1#

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

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

dsf9zpds2#

从Node v15.0.0开始,Node内置了一个基于Promise的sleep函数

您可以使用Timers Promises API睡眠。

import {setTimeout} from 'timers/promises';

await setTimeout(100);

如果你还想使用旧的基于回调的setTimeout()--或者就像名字sleep()--你可以给promise计时器起别名。

import {setTimeout as sleep} from 'timers/promises';

// promise `setTimeout` aliased as `sleep`
await sleep(100);
console.log('I waited'));

// regular callback `setTimeout` (scheduling timers)
setTimeout(() => console.log('I also waited'), 100);
sbtkgmzw

sbtkgmzw3#

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))
})

相关问题