假设没有“原生”方法来实现这一点,我的解决方案是
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 );
3条答案
按热度按时间uurity8g1#
根本没有必要冻结。由于javascript的异步性,我们可以将一部分代码保留一段时间,稍后再继续。首先,我们需要一个有希望的计时器:
我们可以简单地使用它:
或者用一点语法糖:
如果你真的想冻结(非常糟糕),你根本不需要承诺:
dsf9zpds2#
从Node v15.0.0开始,Node内置了一个基于Promise的sleep函数
您可以使用Timers Promises API睡眠。
如果你还想使用旧的基于回调的
setTimeout()
--或者就像名字sleep()
--你可以给promise计时器起别名。sbtkgmzw3#