javascript 中实现sleep
因为javascript 是单线程,异步,所以并没有 像其他语言的sleep内置函数,javascript 里实现流程 暂停,睡觉,可以参考如下两种方式
//second 是秒
const sleep = (second:number) =>{
return new Promise((resolve)=>{
setTimeout(()=>{
resolve(true)
}, second*1000)
})
}
const main = async () =>{
console.log(" 当前时间:", new Date())
await sleep(2)
console.log("2秒后 时间:", new Date())
await sleep(4)
console.log("4秒后 时间:", new Date())
sleep(6).then(()=>{
console.log("6秒后 时间:", new Date())
})
}
打印结果:
结果看上去,也没什么大问题,实现起来很简单,,暂停时间间隔基本都是按照设置的时间,在暂停。能满足大部分需求。
但是,上面并非绝对精准,因为 setTimeout 这类函数的回调函数,会脱离主进程,被安排在 子进程中排队等候处理,然后等待轮询,排到了就立即处理,大概率就会出现延时现象,所以,上面的打印结果,整数秒后面的毫秒值,是有差值的
一旦,子进程中等候处理的前一个耗时更长,比如 IO处理,这里的延迟会更大,我们再换一种方式实现
//second 是秒
function sleep(ms){
ms *=1000;
var start=Date.now(),end = start+ms;
while(Date.now() < end);
return;
}
const main = async () =>{
console.log(" 当前时间:", new Date())
await sleep(2)
console.log("2秒后 时间:", new Date())
await sleep(4)
console.log("4秒后 时间:", new Date())
await sleep(6)
console.log("6秒后 时间:", new Date())
}
打印结果:
这样结果会更加精准一些。用 while循环,一旦达到延迟后的时间点,立即执行
这样虽然更精准,但是不适用暂停太长时间,因为暂停的时间,while是在不断循环,会消弱cpu处理其他事务的能力,这里看的还不是很清楚,我们把在循环里打印一些信息,看看
function sleep(ms){
let i = 0;
ms *=1000;
var start=Date.now(),end = start+ms;
while(Date.now() < end){i++; console.log("循环次数", i)}
return;
}
打印结果:
最后一个6秒的等待,循环计算了 5万多次
总结:两种方法,各有摄取,
如果精度不是很高,用第一种;
如果时间短,精度高,用第二种