睡在 Node.js
Sleep in Node.js
假设没有 "native" 方法来实现这个,我的解决方案是
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
:
(注意它会冻结此页面一秒。)
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
放入我的主进程)。
还有更好的方法吗?
完全没有必要冻结。由于 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");
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))
})
假设没有 "native" 方法来实现这个,我的解决方案是
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
:
(注意它会冻结此页面一秒。)
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
放入我的主进程)。
还有更好的方法吗?
完全没有必要冻结。由于 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");
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))
})